技術頻道導航
HTML/CSS
.NET技術
IIS技術
PHP技術
Js/JQuery
Photoshop
Fireworks
服務器技術
操作系統(tǒng)
網站運營

贊助商

分類目錄

贊助商

最新文章

搜索

【示例】詳解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、lastNameage都是person對象的屬性,并且是可枚舉的,而ssn是不可枚舉的屬性(因為設置了ssnenumerable值為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的基本用法。 

相關文章

x
  • 站長推薦
/* 左側顯示文章內容目錄 */