詳解Object.defineProperty()

本文只是把常用的內(nèi)容記錄一下, 更多詳細說明需直接查看 官方文檔
)

語法

Object.defineProperty(obj, prop, descriptor)

該方法允許精確添加或修改對象的屬性。通過配置可實現(xiàn):1、屬性是否可被枚舉,能夠在屬性枚舉期間呈現(xiàn)出來(for...inObject.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ù)描述符 當且僅當該屬性的writabletrue時,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.aconfigurable屬性為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
});
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容