首页 > 代码库 > javascript中对象的属性的特性

javascript中对象的属性的特性

enumberable: 表示是否能通过for-in循环返回属性。默认为true

writable: 是否可以修改属性, 默认为true

value: 包含这个属性的数据值。读取属性值时3,从这个属性读,写入属性时,把新值保存到这个位置。默认值为undefine.

getter: 在读取属性时,调用的函数

setter: 在写入属性时调用的函数

特别注意:一旦调用了Object.defineProperty方法之后,那些未定义的特性值除了configurable为false之外,其他都为undefined;

2.修改单个属性的特性:

必须使用Object.defineProperty()方法。这个方法接受3个参数: 属性所在的对象,属性的名字,和一个描述符对象。其中描述符对象的属性必须是:configurable, enumberable, writable,value.设置其中一个或者多个值,可以修改对应的特性值。

修改writable特性,设置为false从而使得属性值不可修改,如下所示:

技术分享

var person = {};
Object.defineProperty(person, "name", {
  writable: false,//设置属性的特性为不可修改的  value: "Tom"  //把name属性值设为Tom});
person.name = "Jany"; //试图把name属性值设置为Jany,但是失败了.非严格模式下会忽略此语句,严格模式则会报错的console.log(person.name); //结果仍然为Tom

技术分享

第2到第6行我们设置了name属性的值为Tom,并且把它的writable特性设置为false,然后,我们试图在地7行把它改Jany,但是,最终打印出来的结果仍然是zzy。

修改configurabel特性,设置为false使得属性无法被delete(删除),如下所示:

技术分享

var person = {};
Object.defineProperty(person, "name", {
  configurable: false, //把configurable设置为false  value: "Tom"
});
console.log(person.name); //打印结果为Tomdelete person.name; //试图删除name属性console.log(person.name); //但是name仍然存在,打印出Tom

技术分享

如果我们把configurable属性值改为true,则属性可以被delete

技术分享

 var person = {};
Object.defineProperty(person, "name", {
  configurable: true,
  value: "Tom"
});
console.log(person.name); //打印出Tomdelete person.name; //试图删除name属性console.log(person.name); //删除成功,打印出udefined

技术分享

另外,一旦,我们我们把某个属性的特性设置成了不可配置的,就再也不能把它变回可配置的了。此时,调用Object.defineProperty()方法修改除了writable之外的特性都会报错。

如下:

技术分享

 person = {};
Object.defineProperty(person, "name", {
  configurable: ,
  value: "Tome"
});Object.defineProperty(person, "name", {
  configurable: ,
  value: "lyl"
});
 
console.log(person.name);

技术分享

 我们在浏览器会看到如下的报错信息:

修改getter和setter特性

技术分享

  book = {
  _year: 2004,   edition: 1  };
Object.defineProperty(book, "year", {
    get: () {
     ._year;
  },
    set: (newValue) {
    (newValue > 2004) {
      ._year = newValue;
      .edition += newValue - 2004;
    }
  }
 
});
 
book.year = 2005;
console.log(book.edition);

技术分享

 

3.同时定义(修改)多个属性的特性

由于定义多个属性的可能性很大,因此ES5有定义一个Object.defineProperties方法。利用这个方法可以通过描述符一次定义多个属性。这个方法接受两个对象的参数;第一个对象是要添加和修改器属性的对象,第二个对象的属性与第一个对象中要添加或者修改的顺序一一对应。

技术分享

 book = {};
Object.defineProperties(book, {
    _year: {
    value: 2004
  },
    edition: {
    value: 1,
    writable:   },
    year: {
    get: () {
       ._year;
    },
    set: (newValue){
      (newValue > 2004) {
                ._year = newValue;
        .edition += newValue-2004;
      }
    }
  }
});
 
book.year = 2006;
console.log(book.edition);

技术分享

4.读取属性的特性


javascript中对象的属性的特性