什么是可枚舉屬性
枚舉就是列舉谈撒,可枚舉屬性就是可以列舉的屬性咧七,直白一點就是可以用for in遍歷到的屬性。
propertyIsEnumerable()的用法
obj.propertyIsEnumerable(prop) 是用來判斷屬性是否可枚舉的
- obj: 要檢測的對象
- 參數(shù) prop: 要檢測的屬性的名稱。
- 返回值: Boolean類型锌妻,可枚舉屬性的時候返回true。
可枚舉屬性會對那些操作產(chǎn)生影響
for…in
Object.keys()
JSON.stringify()
下面我們詳細測試一下
1. 可枚舉屬性的遍歷
首先我們看一個栗子:
var p = {name: '張三', age: 28};
for (var key in p) {
console.log('屬性名:' + key + '旬牲,是否可枚舉:' + p.propertyIsEnumerable(key));
}
//輸出結(jié)果:
//->屬性名:name仿粹,是否可枚舉:true
//->屬性名:age,是否可枚舉:true
p上的name和age兩個屬性都被遍歷了原茅,這兩個屬性都是可枚舉屬性吭历,那什么是不可枚舉屬性呢?
2. 不可枚舉屬性不會被遍歷
我們再看一個栗子:
Object.prototype.get_name = function () {
return this.name;
};
var p = new Object({name: '張三'});
for (var key in p) {
console.log('屬性名:' + key + '擂橘,是否可枚舉:' + p.propertyIsEnumerable(key));
}
//輸出結(jié)果:
// ->屬性名:name晌区,是否可枚舉:true
// ->屬性名:get_name,是否可枚舉:false
可能有疑問get_name判斷可枚舉返回的是false怎么還遍歷出來了呢通贞?其實正確的理解是這樣的朗若, get_name不是實例p的屬性是Object原型上的屬性,對于實例p來說是不可枚舉的昌罩,但是對于原型來說是可枚舉的(下面代碼有測試)哭懈。(for…in遍歷,只要在遍歷對象和對象所在的原型鏈上的可枚舉屬性都會被遍歷)
大家想一個問題茎用,get_name是Object的原型上的屬性遣总,被遍歷了。Object的原型上還有很多的屬性绘搞,有toString彤避、hasOwnProperty還有我們現(xiàn)在正在研究的propertyIsEnumerable都是原型上的屬性,怎么就只有自定義的get_name被遍歷出來了呢夯辖?因為其它屬性都是不可枚舉的琉预。看下面代碼:
console.log(p.__proto__.propertyIsEnumerable('get_name'));//->true
console.log(p.__proto__.propertyIsEnumerable('toString'));//->false
console.log(p.__proto__.propertyIsEnumerable('propertyIsEnumerable'));//->false
console.log(p.__proto__.propertyIsEnumerable('hasOwnProperty'));//->false
我們已經(jīng)知道了什么是可枚舉屬性蒿褂,知道了propertyIsEnumerable得用法圆米,我們可不可以自定義一個不可枚舉屬性呢卒暂?當(dāng)然可以。
3. 自定義不可枚舉屬性
var p = new Object({name: '張三'});
//為p設(shè)置不可枚舉屬性
Object.defineProperty(p, "age", {
value: 20,
enumerable: false
});
for (var key in p) {
console.log('屬性名:' + key + '娄帖,是否可枚舉:' + p.propertyIsEnumerable(key));
}
//輸出結(jié)果:屬性名:name也祠,是否可枚舉:true
console.log('age是不是p的可枚舉屬性:' + p.propertyIsEnumerable('age')+',age屬性的值是多少:'+ p.age);
//age是不是p的可枚舉屬性:false近速,age屬性的值是多少:20
通過defineProperty我們就自定義了一個不可枚舉的屬性诈嘿,并且可以正常使用。
4. 不可枚舉屬性對Object.keys()和JSON.stringify()的影響
Object.keys()和JSON.stringify()也不會列舉出不可枚舉屬性削葱,也不會列舉出原型鏈上的所有屬性奖亚。
Object.prototype.get_name = function () {};
var p = new Object({name: '張三'});
//為p設(shè)置不可枚舉屬性
Object.defineProperty(p, "age", {
value: 20,
enumerable: false
});
console.log(Object.keys(p));//輸出結(jié)果->["name"]
console.log(JSON.stringify(p));//輸出結(jié)果->{"name":"張三"}
如果文檔哪里不正確歡迎指正。
本文主要參考文檔:http://www.cnblogs.com/kongxy/p/4618173.html
歡迎轉(zhuǎn)載析砸,但請注明出處昔字。