美文网首页
双向数据绑定核心 - Object.defineProperty

双向数据绑定核心 - Object.defineProperty

作者: w_wx_x | 来源:发表于2019-03-04 11:54 被阅读4次

    Object.defineProperty(obj,prop,descriptor) 返回被传递给函数的对象
      obj    要在其上定义属性的对象
      prop    要定义或修改属性的名称
      descriptor 将被定义或修改的属性描述(数据描述、存取描述)
            是一个对象(configurable,enumerable,value,writable,get,set)

    descriptor.png
    reflect.defineProperty(obj,prop,descriptor)
      返回一个Boolean值,用于表示属性是否定义成功
      其他功能和Object.defineProperty用法一样

    基本使用

    var obj = {a:1};
    Object.defineProperty(obj,"key",{
        configurable:false,        // 默认为false,只有当为true时,属性可以从对象上被删除
        enumerable:false,          // 默认为false,只有为true时,该属性才能够出现在对象的枚举属性中。for...in 循环或Object.keys(obj)遍历对象的属性
        // 描述符:设置set和get时,不可设置value和writable,反之同理
        // 1.数据描述符
        value:'static',            // 默认为undefined,属性对应的值,可为任意有效的js值(数值对象函数等)
        writable:false,            // 默认为false,只有为true时,value才能被赋值运算符改变
        // 2.存取描述符
        get:undefined,             // 访问该属性时,该方法会被执行,无参数传递,会传入this对象
        set:undefined              // 属性值修改时,触发执行该方法,接受唯一参数,即该属性新的参数值
    })
    
    obj.c = 3;
    // 等同于
    Object.defineProperty(obj,"c",{
        value:3,
        writable : true,
        configurable : true,
        enumerable : true
    })
    

    1.enumerable(o.propertyIsEnumerable(属性名),该方法用于判断该属性是否可以被遍历到)


    enumerable.png

    2.configurable


    configurable.png

    3.writable


    writable.png

    4.get、set

    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 }]
    
    // 继承
    var pattern = {
        get: function () {
            return 'I alway return this string,whatever you have assigned';
        },
        set: function () {
            this.myname = 'this is my name string';
        }
    };
    function TestDefineSetAndGet() {
        Object.defineProperty(this, 'myproperty', pattern);
    }
    var instance = new TestDefineSetAndGet();
    instance.myproperty = 'test';
    console.log(instance.myproperty);            // 'I alway return this string,whatever you have assigned'
    console.log(instance.myname);                // 继承属性,'this is my name string'
    

    参考文献:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

    相关文章

      网友评论

          本文标题:双向数据绑定核心 - Object.defineProperty

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