本文只是把常用的內(nèi)容記錄一下, 更多詳細說明需直接查看 官方文檔
)
語法
Object.defineProperty(obj, prop, descriptor)
該方法允許精確添加或修改對象的屬性。通過配置可實現(xiàn):1、屬性是否可被枚舉,能夠在屬性枚舉期間呈現(xiàn)出來(
for...in或Object.keys方法); 2、是否可通過賦值運算符修改; 3、是否可重新配置屬性描述符(descriptor)及刪除。
參數(shù)
- obj
要在其上定義屬性的對象。
- prop
要定義或修改的屬性的名稱。
- descriptor
將被定義或修改的屬性描述符。
返回值
被傳遞給函數(shù)的對象。
屬性描述符(descriptor)
| 屬性 | 默認值 | 類型 | 描述 |
|---|---|---|---|
| configurable | false | - | 當且僅當該屬性的 configurable 為 true 時,該屬性描述符才能夠被改變,同時該屬性也能從對應的對象上被刪除。 |
| enumerable | false | - | 當且僅當該屬性的enumerable為true時,該屬性才能夠出現(xiàn)在對象的枚舉屬性中。 |
| value | undefined | 數(shù)據(jù)描述符 | 該屬性對應的值??梢允侨魏斡行У?JavaScript 值(數(shù)值,對象,函數(shù)等)。 |
| writable | false | 數(shù)據(jù)描述符 | 當且僅當該屬性的writable為true時,value才能被賦值運算符改變。 |
| get | undefined | 存取描述符 | 一個給屬性提供 getter 的方法。 |
| set | undefined | 存取描述符 | 一個給屬性提供 setter 的方法。 |
描述符可同時具有的鍵值
| 類型 | configurable | enumerable | value | writable | get | set |
|---|---|---|---|---|---|---|
| 數(shù)據(jù)描述符 | Yes | Yes | Yes | Yes | No | No |
| 存取描述符 | Yes | Yes | No | No | Yes | Yes |
即:數(shù)據(jù)描述符和存取描述符不能同時存在
configurable
var o = {};
Object.defineProperty(o, "a", { get : function(){return 1;},
configurable : false } );
// throws a TypeError
Object.defineProperty(o, "a", {configurable : true});
// throws a TypeError
Object.defineProperty(o, "a", {enumerable : true});
// throws a TypeError (set was undefined previously)
Object.defineProperty(o, "a", {set : function(){}});
// throws a TypeError (even though the new get does exactly the same thing)
Object.defineProperty(o, "a", {get : function(){return 1;}});
// throws a TypeError
Object.defineProperty(o, "a", {value : 12});
console.log(o.a); // logs 1
delete o.a; // Nothing happens
console.log(o.a); // logs 1
如果o.a的configurable屬性為true,則不會拋出任何錯誤,并且該屬性將在最后被刪除。
enumerable
var o = {};
Object.defineProperty(o, "a", { value : 1, enumerable:true });
Object.defineProperty(o, "b", { value : 2, enumerable:false });
Object.defineProperty(o, "c", { value : 3 }); // enumerable defaults to false
o.d = 4; // 如果使用直接賦值的方式創(chuàng)建對象的屬性,則這個屬性的enumerable為true
for (var i in o) {
console.log(i);
}
// 打印 'a' 和 'd' (in undefined order)
Object.keys(o); // ["a", "d"]
o.propertyIsEnumerable('a'); // true
o.propertyIsEnumerable('b'); // false
o.propertyIsEnumerable('c'); // false
Writable
var o = {}; // Creates a new object
Object.defineProperty(o, 'a', {
value: 37,
writable: false
});
console.log(o.a); // logs 37
o.a = 25; // No error thrown
// (it would throw in strict mode,
// even if the value had been the same)
console.log(o.a); // logs 37. The assignment didn't work.
// strict mode
(function() {
'use strict';
var o = {};
Object.defineProperty(o, 'b', {
value: 2,
writable: false
});
o.b = 3; // throws TypeError: "b" is read-only
return o.b; // returns 2 without the line above
}());
多個屬性和默認值
var o = {};
o.a = 1;
// 等同于 :
Object.defineProperty(o, "a", {
value : 1,
writable : true,
configurable : true,
enumerable : true
});
// 另一方面,
Object.defineProperty(o, "a", { value : 1 });
// 等同于 :
Object.defineProperty(o, "a", {
value : 1,
writable : false,
configurable : false,
enumerable : false
});