在JavaScript中,對象的屬性分為可枚舉和不可枚舉之分,它們是由屬性的enumerable值決定的。可枚舉性決定了這個屬性能否被for…in查找遍歷到。
一、怎么判斷屬性是否可枚舉
js中基本包裝類型的原型屬性是不可枚舉的,如Object, Array, Number等,如果你寫出這樣的代碼遍歷其中的屬性:
|
1
2
3
4
|
var
num =
new
Number();
for
(
var
pro
in
num) {
console.log(
"num."
+ pro +
" = "
+ num[pro]);
}
|
它的輸出結果會是空。這是因為Number中內置的屬性是不可枚舉的,所以不能被for…in訪問到。
Object對象的propertyIsEnumerable()方法可以判斷此對象是否包含某個屬性,並且這個屬性是否可枚舉。
需要注意的是:如果判斷的屬性存在於Object對象的原型內,不管它是否可枚舉都會返回false。
二、枚舉性的作用
屬性的枚舉性會影響以下三個函數的結果:
for…in
Object.keys()
JSON.stringify
PropertyIsEnumerable
propertyIsEnumerable()是用來檢測屬性是否屬於某個對象的,如果檢測到了,返回true,否則返回false.
1.這個屬性必須屬於實例的,並且不屬於原型.
2.這個屬性必須是可枚舉的,也就是自定義的屬性,可以通過for..in循環出來的. 。
hasOwnProperty(property)
判斷對象是否有某個特定的實例屬性。必須用字符串指定該屬性
TheObject.defineProperty()方法定義了一個新的屬性直接在一個對象,或修改現有的屬性的對象,並返回該對象。
方法
Object.defineProperty(obj, prop, descriptor)
obj,待修改的對象prop,帶修改的屬性名稱descriptor,待修改屬性的相關描述
{
configurable: false,
enumerable: false,
writable: false,
value: null,
set: undefined,
get: undefined
}
- configurable ,屬性是否可配置。可配置的含義包括:是否可以刪除屬性( delete ),是否可以修改屬性的 writable 、 enumerable 、 configurable 屬性。
- enumerable ,屬性是否可枚舉。可枚舉的含義包括:是否可以通過 for...in 遍歷到,是否可以通過 Object.keys() 方法獲取屬性名稱。
- writable ,屬性是否可重寫。可重寫的含義包括:是否可以對屬性進行重新賦值。
- value ,屬性的默認值。
- set ,屬性的重寫器(暫且這么叫)。一旦屬性被重新賦值,此方法被自動調用。
- get ,屬性的讀取器(暫且這么叫)。一旦屬性被訪問讀取,此方法被自動調用。

