什么是可枚舉屬性
枚舉就是列舉,可枚舉屬性就是可以列舉的屬性,直白一點(diǎn)就是可以用for in遍歷到的屬性。
propertyIsEnumerable()的用法
obj.propertyIsEnumerable(prop) 是用來判斷屬性是否可枚舉的
- obj: 要檢測(cè)的對(duì)象
- 參數(shù) prop: 要檢測(cè)的屬性的名稱。
- 返回值: Boolean類型,可枚舉屬性的時(shí)候返回true。
可枚舉屬性會(huì)對(duì)那些操作產(chǎn)生影響
for…in
Object.keys()
JSON.stringify()
下面我們?cè)敿?xì)測(cè)試一下
1. 可枚舉屬性的遍歷
首先我們看一個(gè)栗子:
var p = {name: '張三', age: 28};
for (var key in p) {
console.log('屬性名:' + key + ',是否可枚舉:' + p.propertyIsEnumerable(key));
}
//輸出結(jié)果:
//->屬性名:name,是否可枚舉:true
//->屬性名:age,是否可枚舉:true
p上的name和age兩個(gè)屬性都被遍歷了,這兩個(gè)屬性都是可枚舉屬性,那什么是不可枚舉屬性呢?
2. 不可枚舉屬性不會(huì)被遍歷
我們?cè)倏匆粋€(gè)栗子:
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怎么還遍歷出來了呢?其實(shí)正確的理解是這樣的, get_name不是實(shí)例p的屬性是Object原型上的屬性,對(duì)于實(shí)例p來說是不可枚舉的,但是對(duì)于原型來說是可枚舉的(下面代碼有測(cè)試)。(for…in遍歷,只要在遍歷對(duì)象和對(duì)象所在的原型鏈上的可枚舉屬性都會(huì)被遍歷)
大家想一個(gè)問題,get_name是Object的原型上的屬性,被遍歷了。Object的原型上還有很多的屬性,有toString、hasOwnProperty還有我們現(xiàn)在正在研究的propertyIsEnumerable都是原型上的屬性,怎么就只有自定義的get_name被遍歷出來了呢?因?yàn)槠渌鼘傩远际遣豢擅杜e的??聪旅娲a:
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得用法,我們可不可以自定義一個(gè)不可枚舉屬性呢?當(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我們就自定義了一個(gè)不可枚舉的屬性,并且可以正常使用。
4. 不可枚舉屬性對(duì)Object.keys()和JSON.stringify()的影響
Object.keys()和JSON.stringify()也不會(huì)列舉出不可枚舉屬性,也不會(huì)列舉出原型鏈上的所有屬性。
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)載,但請(qǐng)注明出處。