1

一、概念语法

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); //{},需要执行获取方法


二、属性描述符

对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符。

  1. 数据描述符是一个具有值的属性,该值可能是可写的,也可能不是可写的。
  2. 访问器描述符是由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  仍然是,值不变

云深不知处
431 声望10 粉丝