简介
1 .直接在一个对象上定义一个新属性或者修改一个对象的现有属性
2 .通过赋值操作添加的属性通常是可以枚举的,会被for in,Object.keys
语法
Object.defineProperty(obj,prop,descriptor)
1 .obj:要定义属性的对象
2 .要定义的对象或者修改的属性
3 .要定义或者修改的属性描述符
1 .默认添加的属性不能被枚举,不能被删除,值是undefined
const obj = {};
Object.defineProperty(obj, 'age', {})
//这样给一个对象添加了属性,这个属性不能被修改,不能被遍历,不能被删除.默认值是undefined
2 .configurable:true.属性的描述符才能被改变,属性可以被删除.默认是false.除 value 和 writable 特性外的其他特性是否可以被修改.感觉是一个总的锁.当为false的时候,可以被复制,不报错,但是不会成功
3 .wriable:true.value才能被赋值运算符改变.如果原型对象的某个属性的writable为false,那么子对象将无法自定义这个属性,writable属性只能从true改为false,反着来是会报错的.
4 .enumerable:返回一个布尔值,表示目标属性在for in Object.keys,JSON.stringify中是否可以遍历
4 .属性的值value,只要writable,configure一个是true,就允许改动
5 .注意:这些属性不一定是自身属性,有的时候也要考虑继承来的属性.
6 .修改属性:如果属性已经存在的话,Object.defineProperty将尝试根据描述符中的值以及对象当前的配置来修改这个属性.如果旧属性的描述符将其configureable属性设置为false.改属性被认为是不可配置的,并且没有属性可以被改变,除了单独改变wirtable为false.
7 .当视图改变不可配置属性的值时,会报错typeerror,除了value,writable值,除非和之前的值相同.
总结
1 .使用点运算符和Object.defineProperty为对象的属性赋值,数据描述符中的属性默认值是不同的.默认全是true
var o = {};
o.a = 1;
// 等同于:
Object.defineProperty(o, "a", {
value: 1,
writable: true,
configurable: true,
enumerable: true
});
网友评论