资讯专栏INFORMATION COLUMN

Object.defineProperty小记

kviccn / 259人阅读

摘要:为属性时才能被删除,才能更改属性,否则会报错。决定这个对象是否可以通过遍历到该属性。必须是设置为时的设置才能生效。相当于把方法执行了一次使用构造函数主要是限定自定义的和方法适用范围,例如上面的代码,就把这两个方法限定在下。

作用

可以设置对象属性。比如给对象设置新属性或修改原有属性。

用法

示例

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()

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/111915.html

相关文章

  • Object.defineProperty小记

    摘要:为属性时才能被删除,才能更改属性,否则会报错。决定这个对象是否可以通过遍历到该属性。必须是设置为时的设置才能生效。相当于把方法执行了一次使用构造函数主要是限定自定义的和方法适用范围,例如上面的代码,就把这两个方法限定在下。 作用 可以设置对象属性。比如给对象设置新属性或修改原有属性。 用法 示例 Object.defineProperty(obj,key,{ val...

    Forest10 评论0 收藏0
  • Object.defineProperty小记

    摘要:为属性时才能被删除,才能更改属性,否则会报错。决定这个对象是否可以通过遍历到该属性。必须是设置为时的设置才能生效。相当于把方法执行了一次使用构造函数主要是限定自定义的和方法适用范围,例如上面的代码,就把这两个方法限定在下。 作用 可以设置对象属性。比如给对象设置新属性或修改原有属性。 用法 示例 Object.defineProperty(obj,key,{ val...

    fuyi501 评论0 收藏0
  • 详解JavaScript之神奇的Object.defineProperty

    摘要:与当与同时为时,属性不能重新使用定义,严格模式下会报错示例云麒报错当或者为时,属性可以重新使用定义,这一点读者不妨自行测试。 摘要: JavaScript有个很神奇的Object.defineProperty(),了解一下? =与Object.defineProperty 为JavaScript对象新增或者修改属性,有两种不同方式:直接使用=赋值或者使用Object.definePro...

    baishancloud 评论0 收藏0
  • JS属性特性(属性描述符)

    摘要:概念中定义了一个名叫属性描述符的对象,用于描述了的各种特征。只指定则表示属性为只读属性。使用属性描述符对象只能在或中使用。修改已有的属性会抛出类型错误异常添加属性会抛出类型错误异常不能修属性结语我对属性描述符很不熟悉,主要是因为平时用得少。 概念 ECMAScript 5 中定义了一个名叫属性描述符的对象,用于描述了的各种特征。属性描述符对象有4个属性: configurable:可...

    yeyan1996 评论0 收藏0
  • JavaScript深入理解对象方法——Object.defineProperty()

    摘要:返回值被传递给函数的对象。描述该方法允许精确添加或修改对象的属性。描述符必须是两种形式之一不能同时是两者。可以是任何有效的值数值,对象,函数等。该方法返回值被用作属性值。该方法将接受唯一参数,并将该参数的新值分配给该属性。 Object.defineProperties() Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性...

    woshicixide 评论0 收藏0

发表评论

0条评论

kviccn

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<