【示例】详解JavaScript如何检查一个属性是否可枚举
作者:admin 时间:2022-6-10 14:42:13 浏览: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 循环枚举,但是通过原型链继承的属性除外。如果对象没有指定的属性,则此方法返回 false
。
propertyIsEnumerable 方法的基本用法
下面的例子演示了 propertyIsEnumerable
方法在普通对象和数组上的基本用法:
var o = {};
var a = [];
o.prop = 'is enumerable';
a[0] = 'is enumerable';
o.propertyIsEnumerable('prop'); // 返回 true
a.propertyIsEnumerable(0); // 返回 true
用户自定义对象和内置对象
下面的例子演示了用户自定义对象和内置对象上属性可枚举性的区别。
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 循环中可以被循环出来)。
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
属性。
如上例,我们可以创建一个不可枚举的属性:
Object.defineProperty(obj, 'nonEnumerableProp', {
value: 'someValue',
enumerable: false
});
现在可以检查一下上面两例子的可枚举属性。
obj.propertyIsEnumerable('someProp') // => true
obj.propertyIsEnumerable('nonEnumerableProp') // => false
总结
本文详细介绍了 JavaScript 如何检查一个属性是否可枚举,通过本文的学习,应该了解了propertyIsEnumerable
的基本用法。
相关文章
标签: 属性 枚举 propertyIsEnumerable
- 站长推荐