技術(shù)頻道導(dǎo)航
HTML/CSS
.NET技術(shù)
IIS技術(shù)
PHP技術(shù)
Js/JQuery
Photoshop
Fireworks
服務(wù)器技術(shù)
操作系統(tǒng)
網(wǎng)站運(yùn)營(yíng)

贊助商

分類目錄

贊助商

最新文章

搜索

【示例】詳解JavaScript如何檢查一個(gè)屬性是否可枚舉

作者:admin    時(shí)間:2022-6-10 14:42:13    瀏覽:

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

上述例子中,firstNamelastNameage都是person對(duì)象的屬性,并且是可枚舉的,而ssn是不可枚舉的屬性(因?yàn)樵O(shè)置了ssnenumerable值為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

語(yǔ)法

obj.propertyIsEnumerable(prop)

參數(shù)

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ì)象

下面的例子演示了用戶自定義對(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)文章

標(biāo)簽: 屬性  枚舉  propertyIsEnumerable  
x
  • 站長(zhǎng)推薦
/* 左側(cè)顯示文章內(nèi)容目錄 */