在es5開始,所有屬性都具備了屬性描述符。我們可以通過
object.getownpropertydescriptor
來觀察到屬性的描述符,它是長這樣子的。
object.getownpropertydescriptor(, 'a');
//
writable
決定該屬性是否唯讀。
enumerable
決定該屬性是否可列舉。
configurable
決定該屬性是否可重新設定描述符。
當屬性的configurable
為true時,我們可以通過object.defineproperty
來修改屬性描述符。
'use strict';
var foo = ;
for(var i in foo) ;
// 'a'
object.defineproperty(foo, 'a', );
foo.a = 2;// uncaught typeerror: cannot assign to read only property 'a' of object '#'
for(var i in foo) ;
object.defineproperty(foo, 'a', );
getter和setter有兩種方式定義
字面量定義
var foo = ,
set a(value)
};
使用object.defineproperty
定義
var foo = ;
object.defineproperty(
foo,
'a',
, set(value)
});
這個時候再看看屬性a
的描述符。
object.getownpropertydescriptor(foo, 'a')
//
當出現getter
或setter
時,value
和writable
就會失效。
此時,屬性a
的描述符被稱為訪問描述符。
訪問描述符和屬性描述符互斥,如果此時再重新設定value
或者writable
描述符,setter
和getter
也會被丟棄。
當你給乙個物件賦值乙個新的屬性舉個例子foo
時,如果該物件的原型鏈上已存在屬性foo
,並且foo
被標記為唯讀(writable: false
)時,嚴格模式下會丟擲異常,非嚴格模式下,這條賦值語句會被忽略。這種屬性稱為遮蔽屬性。
'use strict';
var anotherobject = {};
object.defineproperty(anotherobject, 'foo', );
var myobject = object.create(anotherobject);// 將myobject的原型設定為anotherobject
console.log(myobject);// {}
console.log(myobject.foo);// 1
myobject.foo = 2;// uncaught typeerror: cannot assign to read only property 'a' of object '#'
還有一種情況
當你給乙個物件賦值乙個新的屬性foo
時,如果該物件的原型鏈上已存在屬性foo
,並且foo
被設定了setter
時,將會呼叫這個setter
,並且該賦值語句將會被忽略,此時也會發生屬性遮蔽。
var anotherobject = {};
object.defineproperty(anotherobject, 'foo', ,
get()
});var myobject = object.create(anotherobject);// 將myobject的原型設定為anotherobject
myobject.foo = 2;// 此時會觸發anotherobject.foo的setter,控制台輸出2
console.log(object.hasownproperty(myobject, 'foo'));// false
使用object.defineproperty
來新增屬性。 屬性描述符
property descriptor 屬性描述符 是乙個普通物件,用於描述乙個屬性的相關資訊 通過object.getownpropertydescriptor 物件,屬性名 可以得到乙個物件的某個屬性的屬性描述符 object.getownpropertydescriptors 物件 可以得到某...
物件屬性描述符
從 es5 開始,物件的屬性都具備了屬性的描述符,它能設定屬性的特性。我們可以使用 object.defineproperty 來新增或者配置乙個屬性並對它的特性進行配置。屬性有 writable enumerable 和 configurable 這三個或之一都為屬性描述符。一.writable ...
Object 屬性描述符
屬性描述符是乙個普通的物件中用來描述屬性的相關資訊。object.getownpropertydescriptor 返回指定屬性描述符 返回物件的key屬性的屬性描述 屬性描述 value 屬性值configurable 該屬性是否可以被屬性描述符修改 enumerable 是否可以列舉 writa...