Object.defineProperty小记

作用

能够设置对象属性。比方给对象设置新属性或修正原有属性。

用法

示例

Object.defineProperty(obj,key,{    
      value: val,    
      enumerable:true,    
      writable: true,    
      configurable: false,
      get:function(){},
       set:function(){},
  });

参数诠释

 obj:要修正属性的对象,
 key:要定义或修正属性值,
 writable:给该属性赋值是不是能够见效,
 enumerable:是不是能够经由过程 for in遍历该属性,
 configurable:是不是可设置, 以及除 writable 特征外的其他特征是不是能够被修正。为    
 true属性时才被删除,才变动enumerable属性,不然会报错。赋值是一向都能够的。
 

下面定义一个空对象,然后用Object.defineProperty要领给这个空对象定义一个新的属性,设置它的writable参数为true。

var obj={ };
Object.defineProperty(obj,'test',{
   value: 'test1',
   writable: true,
});
console.log(obj);//obj{test:test1}

然后转变test属性的值。由于writeble的值为true,所以test属性的值是能够转变的。

obj.test="test2";//obj{test:test2}

假如writable的值为false,则test属性的值不会被转变。

Object.defineProperty(obj,'test',{
     writable: false,
});
obj.test="test3";//obj{test:test2}

enumerable决议这个对象是不是能够经由过程for in遍历到该属性。true为能够经由过程for in遍历该属性。必需是configurable设置为true时enumerable的设置才见效。

Object.defineProperty(obj,'test',{
    enumerable: !!false,
    configurable: true
});
for(var pro in obj){
    console.log(pro +':'+obj[pro]);
}//没有值打印出来

configurable的值为true时才删除属性。

delete obj.test;//胜利删除属性

每一个对象属性都有默许的get和set要领,我们能够改写它。

var myValue;
Object.defineProperty(obj,'haha',{
    set:function () {//get和set要一同设
        myValue='test test';
    },
    get:function(){
        return myValue;
    },
    enumerable: true,
});
for(var pro in obj){
    console.log(pro +':'+obj[pro]);
}//haha:undefined
console.log(obj.haha);//undefined
obj.haha='777';
console.log(obj.haha);//test test

只要给haha赋值时,obj.haha这个属性才会被给予set的值,不然会是 undefined。然则haha这个属性在赋值前就已被定义了。

运用场景

在组织函数里自定义set和get要领。

function Test() {
    var pro = null;
    Object.defineProperty(this, "pro", {
        get: function () {
            return pro;
        },
        set: function (value) {
            pro = value
        }
    });
}
var mytest = new Test();//相当于把要领执行了一次
mytest.pro = haha;
console.log(mytest.pro);//haha

运用组织函数主如果限制自定义的set和get要领适用范围,比方上面的代码,就把这两个要领限制在mytest下。

我对上面一段的代码明白以下:

var Test1=function () {
     function gg() {
         this.tt=1;
     }
     gg.call(this);
 };
 var test = new Test1();
 console.log(test.tt);

参考链接:
Object.defineProperty()

    原文作者:milk
    原文地址: https://segmentfault.com/a/1190000009139579
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞