|
|
|
|
|
JavaScript 提供了一種方法propertyIsEnumerable()
來(lái)確定屬性是否可枚舉。如果屬性是可枚舉的,則返回true
;否則返回false
。例如:
const person = {
firstName: 'John',
lastName: 'Doe'
};
person.age = 25;
Object.defineProperty(person, 'ssn', {
enumerable: false,
value: '123-456-7890'
});
console.log(person.propertyIsEnumerable('firstName')); // => true
console.log(person.propertyIsEnumerable('lastName')); // => true
console.log(person.propertyIsEnumerable('age')); // => true
console.log(person.propertyIsEnumerable('ssn')); // => false
上述例子中,firstName
、lastName
和age
都是person
對(duì)象的屬性,并且是可枚舉的,而ssn
是不可枚舉的屬性(因?yàn)樵O(shè)置了ssn
的enumerable
值為false
)。本示例使用了Object.defineProperty定義對(duì)象可枚舉屬性。
Object.prototype.propertyIsEnumerable()
propertyIsEnumerable()
方法返回一個(gè)布爾值,表示指定的屬性是否可枚舉。
示例
const object1 = {};
const array1 = [];
object1.property1 = 42;
array1[0] = 42;
console.log(object1.propertyIsEnumerable('property1'));
// expected output: true
console.log(array1.propertyIsEnumerable(0));
// expected output: true
console.log(array1.propertyIsEnumerable('length'));
// expected output: false
obj.propertyIsEnumerable(prop)
prop
需要測(cè)試的屬性名。
用來(lái)表示指定的屬性名是否可枚舉的布爾值。
每個(gè)對(duì)象都有一個(gè) propertyIsEnumerable
方法。此方法可以確定對(duì)象中指定的屬性是否可以被 for...in 循環(huán)枚舉,但是通過(guò)原型鏈繼承的屬性除外。如果對(duì)象沒(méi)有指定的屬性,則此方法返回 false
。
propertyIsEnumerable 方法的基本用法
下面的例子演示了 propertyIsEnumerable
方法在普通對(duì)象和數(shù)組上的基本用法:
var o = {};
var a = [];
o.prop = 'is enumerable';
a[0] = 'is enumerable';
o.propertyIsEnumerable('prop'); // 返回 true
a.propertyIsEnumerable(0); // 返回 true
下面的例子演示了用戶自定義對(duì)象和內(nèi)置對(duì)象上屬性可枚舉性的區(qū)別。
var a = ['is enumerable'];
a.propertyIsEnumerable(0); // 返回 true
a.propertyIsEnumerable('length'); // 返回 false
Math.propertyIsEnumerable('random'); // 返回 false
this.propertyIsEnumerable('Math'); // 返回 false
var a = [];
a.propertyIsEnumerable('constructor'); // 返回 false
function firstConstructor() {
this.property = 'is not enumerable';
}
firstConstructor.prototype.firstMethod = function() {};
function secondConstructor() {
this.method = function method() { return 'is enumerable'; };
}
secondConstructor.prototype = new firstConstructor;
secondConstructor.prototype.constructor = secondConstructor;
var o = new secondConstructor();
o.arbitraryProperty = 'is enumerable';
o.propertyIsEnumerable('arbitraryProperty'); // 返回 true
o.propertyIsEnumerable('method'); // 返回 true
o.propertyIsEnumerable('property'); // 返回 false
o.property = 'is enumerable';
o.propertyIsEnumerable('property'); // 返回 true
// 之所以這些會(huì)返回 false,是因?yàn)?,在原型鏈?nbsp;propertyIsEnumerable 不被考慮
// (盡管最后兩個(gè)在 for-in 循環(huán)中可以被循環(huán)出來(lái))。
o.propertyIsEnumerable('prototype'); // 返回 false (根據(jù) JS 1.8.1/FF3.6)
o.propertyIsEnumerable('constructor'); // 返回 false
o.propertyIsEnumerable('firstMethod'); // 返回 false
使用 Object.defineProperty 定義對(duì)象枚舉屬性
我們知道了如何檢查一個(gè)屬性是否可枚舉,我可以定義對(duì)象的可枚舉屬性,為此,我們使用Object.defineProperty
。
首先,讓我們采用一個(gè)現(xiàn)有的空對(duì)象。
let obj = {};
通常,我們可以這樣定義屬性:
obj.someProp = 'someValue';
但是,如果我們想為此屬性指定內(nèi)部標(biāo)志(如 enumerable
),我們可以使用defineProperty
。
Object.defineProperty(obj, 'someProp', {
value: 'someValue',
enumerable: true
});
上面的例子是不必要的,因?yàn)樗瓿闪伺c普通屬性分配相同的事情,因?yàn)樗?code>enumerable默認(rèn)值是true
。本例僅僅為了展示如何設(shè)置enumerable
屬性。
如上例,我們可以創(chuàng)建一個(gè)不可枚舉的屬性:
Object.defineProperty(obj, 'nonEnumerableProp', {
value: 'someValue',
enumerable: false
});
現(xiàn)在可以檢查一下上面兩例子的可枚舉屬性。
obj.propertyIsEnumerable('someProp') // => true
obj.propertyIsEnumerable('nonEnumerableProp') // => false
總結(jié)
本文詳細(xì)介紹了 JavaScript 如何檢查一個(gè)屬性是否可枚舉,通過(guò)本文的學(xué)習(xí),應(yīng)該了解了propertyIsEnumerable
的基本用法。
相關(guān)文章