天天看點

Object.defineProperty(),Object.defineProperties()

​Object.defineProperty()​

​方法允許通過屬性描述對象,定義或修改一個屬性,然後傳回修改後的對象,它的用法如下。

Object.defineProperty(object, propertyName, attributesObject)      

Object.defineProperty方法接受三個參數,依次如下。

  • ​object​

    ​:屬性所在的對象
  • ​propertyName​

    ​:字元串,表示屬性名
  • ​attributesObject​

    ​:屬性描述對象

例如:

var obj = Object.defineProperty({}, 'p', {
  value: 123,
  writable: false,
  enumerable: true,
  configurable: false
});

obj.p // 123

obj.p = 246;
obj.p // 123      

上面代碼中,​

​Object.defineProperty()​

​​方法定義了​

​obj.p​

​​屬性。由于屬性描述對象的​

​writable​

​​屬性為​

​false​

​​,是以​

​obj.p​

​​屬性不可寫。注意,這裡的​

​Object.defineProperty​

​​方法的第一個參數是​

​{}​

​​(一個建立的空對象),​

​p​

​​屬性直接定義在這個空對象上面,然後傳回這個對象,這是​

​Object.defineProperty()​

​​的常見用法。

如果屬性已經存在,​​

​Object.defineProperty()​

​​方法相當于更新該屬性的屬性描述對象。

如果一次性定義或修改多個屬性,可以使用​​

​Object.defineProperties()​

​方法。

var obj = Object.defineProperties({}, {
  p1: { value: 123, enumerable: true },
  p2: { value: 'abc', enumerable: true },
  p3: { get: function () { return this.p1 + this.p2 },
    enumerable:true,
    configurable:true
  }
});

obj.p1 // 123
obj.p2 // "abc"
obj.p3 // "123abc"      

上面代碼中,​

​Object.defineProperties()​

​​同時定義了​

​obj​

​​對象的三個屬性。其中,​

​p3​

​​屬性定義了取值函數​

​get​

​,即每次讀取該屬性,都會調用這個取值函數。

【注意】:一旦定義了取值函數​

​get​

​​(或存值函數​

​set​

​​),就不能将​

​writable​

​​屬性設為​

​true​

​​,或者同時定義​

​value​

​屬性,否則會報錯。

var obj = {};

Object.defineProperty(obj, 'p', {
  value: 123,
  get: function() { return 456; }
});
// TypeError: Invalid property.
// A property cannot both have accessors and be writable or have a value

Object.defineProperty(obj, 'p', {
  writable: true,
  get: function() { return 456; }
});
// TypeError: Invalid property descriptor.
// Cannot both specify accessors and a value or writable attribute      
var obj = {};
Object.defineProperty(obj, 'foo', {});
Object.getOwnPropertyDescriptor(obj, 'foo')
// {
//   value: undefined,
//   writable: false,
//   enumerable: false,
//   configurable: false
// }      

繼續閱讀