Javascript屬性屬性

2018-01-06 19:14 更新

Javascript面向對象設計 - Javascript屬性屬性


檢索屬性屬性

要獲取屬性屬性,請使用Object.getOwnPropertyDescriptor()。

此方法僅適用于自己的屬性。

此方法接受兩個參數(shù):要處理的對象和要檢索的屬性名稱。

如果屬性存在,您應該接收一個描述符對象有四個屬性:可配置,可枚舉,并且兩個其他適合于屬性的類型。

例如,以下代碼創(chuàng)建一個屬性并檢查其屬性:


var book1 = { 
    name : "Javascript" 
}; // w  ww. j  a va2 s  . c  o m

var descriptor = Object.getOwnPropertyDescriptor(book1, "name"); 

console.log(descriptor.enumerable);     // true 
console.log(descriptor.configurable);   // true 
console.log(descriptor.writable);       // true 
console.log(descriptor.value);          // "Javascript" 

上面的代碼生成以下結果。



防止對象修改

上面的代碼生成以下結果。...

[[Extensible]]屬性是一個布爾值,指示對象本身是否可以修改。

我們創(chuàng)建的所有對象默認都是可擴展的,這意味著可以在任何時候向對象添加新屬性。

通過將[[Extensible]]設置為false,我們可以防止新的屬性添加到對象。

有三種不同的方法來完成這個。

防止擴展

創(chuàng)建不可擴展對象的一種方法是使用Object.preventExtensions()方法。

創(chuàng)建不可擴展對象的一種方法是使用Object.preventExtensions()方法。...

在對象上使用這個方法后,我們永遠不會再次向其中添加任何新屬性。

我們可以使用Object.isExtensible()檢查[[Extensible]]的值。

我們可以使用Object.isExtensible()檢查[[Extensible]]的值。...


var book1 = { 
    name : "Javascript" 
}; /* w ww  .ja v  a 2s.  c  om*/

console.log(Object.isExtensible(book1));      // true 

Object.preventExtensions(book1); 
console.log(Object.isExtensible(book1));      // false 

book1.writeLine = function() { 
     console.log(this.name); 
}; 

console.log("writeLine" in book1);              // false 

上面的代碼生成以下結果。

嘗試向不可擴展對象添加屬性將在strict中拋出錯誤模式。

在非嚴格模式下,操作失敗。



密封對象

創(chuàng)建不可擴展對象的第二種方式是密封對象。

密封對象不可擴展,其所有屬性都是不可配置的。

我們不能向對象添加新屬性,我們不能刪除屬性或更改其類型。

如果對象被密封,您只能讀取和寫入其屬性。

我們可以在對象上使用Object.seal()方法來封裝它。

調用Object.seal()方法后,[[Extensible]]屬性設置為false,并且所有屬性的[[Configurable]]屬性設置為false。

我們可以使用Object.isSealed()來檢查對象是否被密封,如下所示:


var book1 = { 
    name : "Javascript" 
}; // w w  w.  j  a v a 2  s. c o  m

console.log(Object.isExtensible(book1));      // true 
console.log(Object.isSealed(book1));          // false 

Object.seal(book1); 
console.log(Object.isExtensible(book1));      // false 
console.log(Object.isSealed(book1));          // true 

book1.writeLine = function() { 
    console.log(this.name); 
}; 

console.log("writeLine" in book1);              // false 

book1.name = "CSS"; 
console.log(book1.name);                      // "CSS" 

delete book1.name; 
console.log("name" in book1);                 // true 
console.log(book1.name);                      // "CSS" 

var descriptor = Object.getOwnPropertyDescriptor(book1, "name"); 
console.log(descriptor.configurable);           // false 

上面的代碼生成以下結果。

上面的代碼生成以下結果。...

凍結對象

創(chuàng)建不可擴展對象的最后一種方法是凍結它。

創(chuàng)建不可擴展對象的最后一種方法是凍結它。...

凍結對象是一個密封對象,其中數(shù)據屬性也是只讀的。

冷凍物品凍結后不能凍結。

我們可以通過使用Object.freeze()來凍結對象,并確定是否通過使用Object.isFrozen()凍結對象。

例如:


var book1 = { 
    name : "Javascript" 
}; /* w  w w  .ja  v a  2s  .co  m*/

console.log(Object.isExtensible(book1));      // true 
console.log(Object.isSealed(book1));          // false 
console.log(Object.isFrozen(book1));          // false 

Object.freeze(book1); 
console.log(Object.isExtensible(book1));      // false 
console.log(Object.isSealed(book1));          // true 
console.log(Object.isFrozen(book1));          // true 

book1.writeLine = function() { 
    console.log(this.name); 
}; 

console.log("writeLine" in book1);              // false 

book1.name = "CSS"; 
console.log(book1.name);                      // "Javascript" 

delete book1.name; 
console.log("name" in book1);                 // true 
console.log(book1.name);                      // "Javascript" 

var descriptor = Object.getOwnPropertyDescriptor(book1, "name"); 
console.log(descriptor.configurable);           // false 
console.log(descriptor.writable);               // false 

上面的代碼生成以下結果。

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號