美文网首页
双向数据绑定核心 - 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