一、概念语法
Object.defineProperty(obj,prop,descriptor)
参数:
1.obj:要在其上定义属性的对象
2.key:要定义或者修改的属性
3.descriptor:将被定义或者修改的属性描述符
返回值:
obj:传递给函数的对象
作用:
直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
默认情况下,使用Object.defineProperty()添加的属性值是不可变的。
var obj = {},person="xiaoming"
Object.defineProperty(obj,"name",{
get:function(){ // 获取属性值
return person
},
set:function(value){ //设置属性值
person = value
}
})
console.log(obj); //{} obj的属性值 颜色是虚的,但是可以更改
console.log(obj.name); //xiaoming
//设置属性值
obj.name = "xiaohong";
console.log(obj) //{}
console.log(obj.name); //xiaohong
总结:直接设置存取器属性是无法直接在对象中体现出来console.log(obj); //{},需要执行获取方法
二、属性描述符
对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符。
- 数据描述符是一个具有值的属性,该值可能是可写的,也可能不是可写的。
- 访问器描述符是由getter-setter函数对描述的属性。
描述符必须是这两种形式之一;不能同时是两者。
注意1:点运算符和Object.defineProperty()为对象的属性赋值时,数据描述符中的属性默认值是不同的,如下例所示。
var o = {};
o.a = 1;
// 等同于 :
Object.defineProperty(o, "a", {
value : 1,
writable : true,
configurable : true,
enumerable : true
});
// 另一方面,
Object.defineProperty(o, "a", { value : 1 });
// 等同于 :
Object.defineProperty(o, "a", {
value : 1,
writable : false,
configurable : false,
enumerable : false
});
因此:默认情况下,使用Object.defineProperty()添加的属性值是不可变的。
因为默认writalbe:false,不可写
示例
Object.defineProperty(obj,"name",{
value:"xiaoming"
});
console.log( obj.name ); //xiaoming
console.log(obj) //{name:"xiaoming"}
//此时修改属性值不可变
obj.name = "";
console.log(obj.name); //xiaoming 仍然是,值不变