根據《JavaScript高級程序設計(第3版)》中的介紹,139頁6.1.1“屬性類型”中,對屬性特性的描述是這樣的:
特性標簽
默認值
說明
[[Configurable]]
true
能否通過delete刪除屬性從而重新定義屬性、能否修改屬性特性、能否把數(shù)據屬性修改為訪問器屬性。
[[Enumerable]]
true
能否通過for-in循環(huán)返回屬性
[[Writable]]
true
能否修改屬性值
[[Value]]
undefined
包含這個屬性的數(shù)據值
?“要修改屬性默認的特性,必須使用ECMAScript5的Object.defineProperty()方法?!??
下面做一組實踐:
alert后的注釋內容為彈出窗口的實際內容。
/*不使用Object.defineProperty()方法的情況*/
var person={
name:"Nicholas"
};
alert(person.name); //Nicholas
person.name="Greg";
alert(person.name); //Greg
delete person.name;
alert(person.name); //undefined
↑這符合常規(guī)邏輯。
/*屬性值在Object.defineProperty()方法中定義的情況*/
var person={};
Object.defineProperty(person,"name",{
value:"Nicholas"
});
alert(person.name); //Nicholas
person.name="Greg";
alert(person.name); //Nicholas
delete person.name;
alert(person.name); //Nicholas
↑可以看到,在方法中定義屬性值后,該屬性值不可改且無法被刪除。這與書中特性的默認值為true似乎相悖。
/*在Object.defineProperty()中顯式定義[[configurable]]、[[writable]]為true后的情況*/
var person={};
Object.defineProperty(person,"name",{
configurable:true,
writable:true,
value:"Nicholas"
});
alert(person.name); //Nicholas
person.name="Greg";
alert(person.name); //Greg
delete person.name;
alert(person.name); //undefined
↑顯式定義[[configurable]]、[[writable]]特性為true后,才與第一種情況一樣。
?
以上測試基于火狐瀏覽器23.0.1和IE11瀏覽器,alert后的注釋內容即為彈出窗口顯示結果。
?
這似乎應該總結如下:在沒使用Object.defineProperty()方法時,數(shù)據屬性的[[configurable]]、[[writable]]等特性默認值為true。而使用了Object.defineProperty()方法設置屬性值后,[[configurable]]、[[writable]]等特性的默認值即變?yōu)閒alse。不顯式的設置它們的值為true,則該屬性即為不可寫、不可刪。
?
不知以上總結是否正確,這里面又蘊含什么規(guī)律?書本僅說明這些特性的默認值為true是否忽略了一些情況?
本人為在校大學生,虛心請教各位大神。
關于JavaScript數(shù)據[[屬性特性]]的疑問
素胚勾勒不出你
2018-12-06 18:45:48