属性
属性的一些性质
- configurable:是否可以配置
- enumerable:是否可以遍历
-
添加属性
直定义属性
var obj = {};
obj.name = "name";
Object.defineProperty
第二个参数是字符串或者symbol
存取描述符
get
属性的 getter 函数,如果没有 getter,则为undefined。当访问该属性时,会调用此函数。执行时不传入任何参数,但是会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象)。该函数的返回值会被用作属性的值。默认为undefined。
set
属性的 setter 函数,如果没有 setter,则为undefined。当属性值被修改时,会调用此函数。该方法接受一个参数(也就是被赋予的新值),会传入赋值时的this对象。默认为undefined。
const obj = {};
let value = 0;
Object.defineProperty(obj, "value", {
enumerable: false,
configurable: false,
get() {
return value
},
set(v) {
value = v
}
})
数据描述符
configurable
当且仅当该属性的configurable键值为true时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为false。
enumerable
当且仅当该属性的enumerable键值为true时,该属性才会出现在对象的枚举属性中。默认为false。
数据描述符还具有以下可选键值:
value
该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为undefined。
writable
当且仅当该属性的writable键值为true时,属性的值,也就是上面的value,才能被赋值运算符改变。默认为false。
const obj = {};
Object.defineProperty(obj, "value", {
enumerable: false,
configurable: false,
value: 1,
writable: true,
})