Object.defineProperty / Object.defineProperties
enumerable 是否可枚举,可以利用这一特性设置一些私有属性
value,只要writable和configurable有一个为true,就允许改动
基本上,JavaScript 原生提供的属性都是不可枚举的,用户自定义的属性都是可枚举的。
与枚举性相关的几个操作的区别的是,for...in
循环包括继承自原型对象的属性,Object.keys
方法只返回对象本身的属性。如果需要获取对象自身的所有属性,不管是否可枚举,可以使用Object.getOwnPropertyNames
方法,详见下文。
考虑到JSON.stringify
方法会排除enumerable
为false
的值,有时可以利用这一点,为对象添加注释信息。
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}"