No more than code.
Object.defineProperty
Object.defineProperty()
定义新属性或修改原有的属性,并返回这个对象。
Object.defineProperty(obj, prop, descriptor)
参数: obj:必需。目标对象 prop:必需。需定义或修改的属性的名字 descriptor:必需。目标属性所拥有的特性
给对象的属性添加特性描述,目前提供两种形式:数据描述和存取器描述。
数据描述符是一个拥有可写或不可写值的属性。 存取描述符是由一对 getter-setter 函数功能来描述的属性。 描述符必须是两种形式之一;不能同时是两者。
数据描述
**enumerable**
:此属性是否可以被枚举(使用for…in或Object.keys()),默认为false
**value**
:属性值,可以是任意类型,默认undefined
**writable**
:属性值是否可以被重写,默认为false
**configurable**
:是否可以删除目标属性或是否可以再次修改属性的特性(writable, configurable, enumerable),设置为true可以被删除或可以重新设置特性;设置为false,不能被可以被删除或不可以重新设置特性,默认为false
提示:一旦使用Object.defineProperty给对象添加属性,那么如果不设置属性的特性,那么configurable、enumerable、writable这些值都为默认的false
var obj = {
test:"hello"
}
//对象已有的属性添加特性描述
Object.defineProperty(obj,"test",{
configurable:true | false,
enumerable:true | false,
value:任意类型的值,
writable:true | false
});
//对象新添加的属性的特性描述
Object.defineProperty(obj,"newKey",{
configurable:true | false,
enumerable:true | false,
value:任意类型的值,
writable:true | false
});
存取器描述
var obj = {};
Object.defineProperty(obj,"newKey",{
get:function (){ return ... } | undefined,
set:function (value){} | undefined
configurable: true | false
enumerable: true | false
});
注意:
-
当使用了getter或setter方法,不允许使用writable和value这两个属性。
-
get或set不是必须成对出现,任写其一就可以。如果不设置方法,则get和set的默认值为undefined。
-
当读取某个属性时,在对象内部调用了get方法,该方法必须要有return语句。
-
当设置某个属性时,在对象的内部调用了set方法,该方法接收唯一参数给属性赋值。
—— getter/setter
var obj = {};
var initValue = 'hello';
Object.defineProperty(obj,"newKey",{
get:function (){
//当获取值的时候触发的函数
return initValue;
},
set:function (value){
//当设置值的时候触发的函数,设置的新值通过参数value拿到
initValue = value;
}
});
//获取值
console.log( obj.newKey ); //hello
//设置值
obj.newKey = 'change value';
console.log( obj.newKey ); //change value