Object.defineProperty / Object.defineProperties
enumerable 是否可枚舉伍俘,可以利用這一特性設(shè)置一些私有屬性
value,只要writable和configurable有一個(gè)為true铁瞒,就允許改動(dòng)
基本上,JavaScript 原生提供的屬性都是不可枚舉的镶蹋,用戶(hù)自定義的屬性都是可枚舉的滤淳。
與枚舉性相關(guān)的幾個(gè)操作的區(qū)別的是,for...in
循環(huán)包括繼承自原型對(duì)象的屬性琉苇,Object.keys
方法只返回對(duì)象本身的屬性嘲玫。如果需要獲取對(duì)象自身的所有屬性,不管是否可枚舉并扇,可以使用Object.getOwnPropertyNames
方法,詳見(jiàn)下文抡诞。
考慮到JSON.stringify
方法會(huì)排除enumerable
為false
的值穷蛹,有時(shí)可以利用這一點(diǎn)土陪,為對(duì)象添加注釋信息。
var o = {a: 1, b: 2};
o.c = 3;
Object.defineProperty(o, 'd', {
value: 4,
enumerable: false
});
o.d // 4
for (var key in o) {
console.log(o[key]);
}
// 1
// 2
// 3
Object.keys(o) // ["a", "b", "c"]
JSON.stringify(o) // "{a:1, b:2, c:3}"
// ======================================
var car = {
id: 123,
color: 'red',
ownerId: 12
};
var owner = {
id: 12,
name: 'Jack'
};
Object.defineProperty(car, 'ownerInfo', {
value: owner,
enumerable: false
});
car.ownerInfo
// {id: 12, name: "Jack"}
JSON.stringify(car)
// "{"id": 123,"color": "red","ownerId": 12}"