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
// }