2014-02-27 91 views
7

你能告訴我如何解凍Javascript中的凍結對象,以便我可以修改其屬性?如何解凍/解凍Javascript中的凍結對象?

var pizza = { 
    name: 'Peri Peri', 
    Topping: 'Prawn' 
}; 

Object.freeze(pizza); 

// Can't change the name of the object because it's frozen 
pizza.name = 'Hawaiian'; 
+0

如果凍結對象可以簡單地解凍,會有什麼意義呢? – RobG

回答

12

技術上,Object.freeze使對象不可改變的。從該頁面引用,

任何內容都不能添加到凍結的對象的屬性集中或從中刪除。任何試圖這樣做的嘗試都將失敗,無論是默默地或通過拋出TypeError異常(當在 嚴格模式下時,最常見但不排除) 。

無法更改數據屬性的值。訪問器屬性 (獲取器和設置器)的工作方式相同(並且仍然給出 您正在更改該值的錯覺)。請注意,對象的值 仍然會被修改,除非它們也被凍結。

所以,可以這樣做的唯一途徑是,通過克隆對象

var pizza = { 
    name: 'Peri Peri', 
    Topping: 'Prawn' 
}; 

Object.freeze(pizza); 
pizza.name = 'Hawaiian'; 
console.log(pizza); 
// { name: 'Peri Peri', Topping: 'Prawn' } 

pizza = JSON.parse(JSON.stringify(pizza)); // Clones the object 

pizza.name = 'Hawaiian'; 
console.log(pizza); 
// { name: 'Hawaiian', Topping: 'Prawn' } 

注1:在嚴格模式下,它會失敗默默並拋出一個錯誤,而不是

"use strict"; 
... 
... 
pizza.name = 'Hawaiian'; 
     ^
TypeError: Cannot assign to read only property 'name' of #<Object> 

注2:如果你的對象有方法,然後JSON.stringify方法將不是得到它們。您可以閱讀更多有關克隆thesethreequestions中的對象的信息。

+0

不會使用'Object.create'比使用JSON更短更快嗎? –

+0

@DanD。但是我不能用Object.create克隆,對吧? – thefourtheye

2

您不能:Source

凍結的對象是鎖定下來的終極形式。一旦對象 被凍結,它就不能被解凍 - 也不能以任何方式被篡改。這是確保您的物品無限期留下的最佳方式。

從一個類似的問題在這裏:https://stackoverflow.com/a/19293418/1420186

+0

你剛纔複製這個http://stackoverflow.com/questions/19293321/opposite-of-object-freeze-or-object-seal-in-javascript –

+4

是啊這就是爲什麼他把它放在'blockquote' – chiliNUT