美文网首页
Object.defineProperty()

Object.defineProperty()

作者: 雨蒙_snow | 来源:发表于2018-07-13 17:40 被阅读0次

    Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。
    Object.defineProperty(obj, prop, descriptor)
    参数
    obj 要在其上定义属性的对象。
    prop 要定义或修改的属性的名称。
    descriptor 将被定义或修改的属性描述符。
    返回值
    被传递给函数的对象。

    对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符。数据描述符是一个具有值的属性,该值可能是可写的,也可能不是可写的。存取描述符是由getter-setter函数对描述的属性。描述符必须是这两种形式之一;不能同时是两者。
    get
    一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象)
    默认为 underfined

    set
    一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。
    默认为 underfined

    创建属性
    如果对象中不存在指定的属性,Object.defineProperty()就创建这个属性。当描述符中省略某些字段时,这些字段将使用它们的默认值。拥有布尔值的字段的默认值都是false。value,get和set字段的默认值为undefined。一个没有get/set/value/writable定义的属性被称为“通用的”,并被“键入”为一个数据描述符。

    // 在对象中添加一个属性与存取描述符的示例
    var o ={};
    var bValue;
    Object.defineProperty(o, "b", {
    get : function(){
    return bValue;
    },
    set : function(newValue){
    bValue = newValue;
    },
    enumerable : true,
    configurable : true
    });

    o.b = 38;
    此时 bValue 为成了38.
    // 对象o拥有了属性b,值为38

    // o.b的值现在总是与bValue相同,除非重新定义o.b

    一般的 Setters 和 Getters
    下面的例子展示了如何实现一个自存档对象。 当设置temperature 属性时,archive 数组会获取日志条目。
    function Archiver() {
    var temperature = null;
    var archive = [];

    Object.defineProperty(this, 'temperature', {
    get: function() {
    console.log('get!');
    return temperature;
    },
    set: function(value) {
    temperature = value;
    archive.push({ val: temperature });
    }
    });

    this.getArchive = function() { return archive; };
    }

    var arc = new Archiver();
    arc.temperature; // 'get!'
    arc.temperature = 11;
    arc.temperature = 13;
    arc.getArchive(); // [{ val: 11 }, { val: 13 }]

    相关文章

      网友评论

          本文标题:Object.defineProperty()

          本文链接:https://www.haomeiwen.com/subject/tmjspftx.html