|
|
|
|
|
JavaScript 提供了一種方法propertyIsEnumerable()
來確定屬性是否可枚舉。如果屬性是可枚舉的,則返回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
對象的屬性,并且是可枚舉的,而ssn
是不可枚舉的屬性(因為設置了ssn
的enumerable
值為false
)。本示例使用了Object.defineProperty定義對象可枚舉屬性。
Object.prototype.propertyIsEnumerable()
propertyIsEnumerable()
方法返回一個布爾值,表示指定的屬性是否可枚舉。
示例
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
需要測試的屬性名。
用來表示指定的屬性名是否可枚舉的布爾值。
每個對象都有一個 propertyIsEnumerable
方法。此方法可以確定對象中指定的屬性是否可以被 for...in 循環(huán)枚舉,但是通過原型鏈繼承的屬性除外。如果對象沒有指定的屬性,則此方法返回 false
。
propertyIsEnumerable 方法的基本用法
下面的例子演示了 propertyIsEnumerable
方法在普通對象和數組上的基本用法:
var o = {};
var a = [];
o.prop = 'is enumerable';
a[0] = 'is enumerable';
o.propertyIsEnumerable('prop'); // 返回 true
a.propertyIsEnumerable(0); // 返回 true
下面的例子演示了用戶自定義對象和內置對象上屬性可枚舉性的區(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
// 之所以這些會返回 false,是因為,在原型鏈上 propertyIsEnumerable 不被考慮
// (盡管最后兩個在 for-in 循環(huán)中可以被循環(huán)出來)。
o.propertyIsEnumerable('prototype'); // 返回 false (根據 JS 1.8.1/FF3.6)
o.propertyIsEnumerable('constructor'); // 返回 false
o.propertyIsEnumerable('firstMethod'); // 返回 false
使用 Object.defineProperty 定義對象枚舉屬性
我們知道了如何檢查一個屬性是否可枚舉,我可以定義對象的可枚舉屬性,為此,我們使用Object.defineProperty
。
首先,讓我們采用一個現有的空對象。
let obj = {};
通常,我們可以這樣定義屬性:
obj.someProp = 'someValue';
但是,如果我們想為此屬性指定內部標志(如 enumerable
),我們可以使用defineProperty
。
Object.defineProperty(obj, 'someProp', {
value: 'someValue',
enumerable: true
});
上面的例子是不必要的,因為它完成了與普通屬性分配相同的事情,因為它的enumerable
默認值是true
。本例僅僅為了展示如何設置enumerable
屬性。
如上例,我們可以創(chuàng)建一個不可枚舉的屬性:
Object.defineProperty(obj, 'nonEnumerableProp', {
value: 'someValue',
enumerable: false
});
現在可以檢查一下上面兩例子的可枚舉屬性。
obj.propertyIsEnumerable('someProp') // => true
obj.propertyIsEnumerable('nonEnumerableProp') // => false
總結
本文詳細介紹了 JavaScript 如何檢查一個屬性是否可枚舉,通過本文的學習,應該了解了propertyIsEnumerable
的基本用法。
相關文章