js中的属性分为 数据属性 和 访问器属性。
数据属性
一个数据属性,有四个描述其行为的特性。
Configurable
是否能通过删除该属性从而重新定义该属性,能否修改其特性,能否把属性修改为访问器属性。默认值为true。Enumerable
是否可枚举。默认值为true。Writable
是否可重写(修改)。默认值为true。Value
数据值。默认值为undefined。
var obj = {
name: 'zed'
}
如果这样定义一个属性,那么它的Value
特性为’zed’,其余特性均为true。
修改属性的特性,则需要使用es5中提供的Object.defineProperty()
方法。
Object.defineProperty()
接收三个参数,第一个参数为属性所在的对象,第二个为修改的属性名,第三个参数需提供修改的特性。- 以这种方式定义的属性,特性默认值为false,value为undefined。
var obj = {};
Object.defineProperty(obj, 'name', {
configurable: true,
writable: false,
enumerable: false,
value:'zed'
});
console.log(obj);
obj.name = 'xxx';
上面的栗子中,name属性是只读的,最后一行的赋值操作在非严格模式下会被忽略,严格模式下会抛出错误。
var obj = {};
Object.defineProperty(obj, 'name', {
configurable: false,
enumerable: true,
writable: true,
value: 'zed'
});
delete obj.name;
obj.name = 'xxx';
console.log(Object.keys(obj));//测试是否可枚举
console.log(obj);
Object.defineProperty(obj, 'name', {
configurable: true,
enumerable: false,
writable: false,
});
//报错
delete obj.name;
obj.name = 'zed';
console.log(Object.keys(obj));//测试是否可枚举
console.log(obj);
一旦将特性Configurable
设置为false,那么再次修改除了Writable
外的特性,那么就会抛出错误。也就是说,可以使用Object.defineProperty()
多次配置属性的特性,可一旦设置为不可配置的,那么就会有限制了。
访问器属性
待补充…
定义多个属性
利用es5中的Object.defineProperties()
方法即可实现。接收两个参数,第一个参数为操作的对象,第二个参数为属性。
var obj = {};
Object.defineProperties(obj, {
name: {
value: 'zed',
enumerable: true
},
age: {
value: 18,
writable: true,
enumerable: true
},
id: {
value: Date.now(),
}
})
obj.age = 20;
obj.name = 'zzzzz';
obj.id = 123456;
console.log(obj)//{name: "zed", age: 20, id: 1605192721858}
console.log(Object.keys(obj))//["name", "age"]
console.log(obj.id)//1605192721858