JS中可枚舉屬性(enumerable)和propertyIsEnumerable()

什么是可枚舉屬性

枚舉就是列舉,可枚舉屬性就是可以列舉的屬性,直白一點(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)注明出處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.屬性的簡潔表示法 允許直接寫入變量和函數(shù) 上面代碼表明,ES6 允許在對(duì)象之中,直接寫變量。這時(shí),屬性名為變量...
    雨飛飛雨閱讀 1,253評(píng)論 0 3
  • 屬性的簡潔表示法 ES6允許直接寫入變量和函數(shù),作為對(duì)象的屬性和方法。這樣的書寫更加簡潔。 上面代碼表明,ES6允...
    呼呼哥閱讀 3,008評(píng)論 0 2
  • 概述 JavaScript提供了一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu),用來描述一個(gè)對(duì)象的屬性的行為,控制它的行為。這被稱為“屬性描述對(duì)...
    zjh111閱讀 780評(píng)論 0 0
  • 本篇主要介紹JS中常用Object的屬性方法。 delete 操作 in 運(yùn)算符 obj.hasOwnProper...
    boySpray閱讀 2,176評(píng)論 0 2
  • 這個(gè)年紀(jì),這種生活背景下想寫的第一篇小隨筆,讓自己很意外的是這個(gè)主題。一切都是機(jī)緣巧合,在今天邂逅這個(gè)平臺(tái)以...
    靜夜星月閱讀 201評(píng)論 0 1

友情鏈接更多精彩內(nèi)容