2011-09-16 52 views

回答

2

沒有什麼可以添加或設置一個frozen 對象的屬性中刪除。任何試圖這樣做的嘗試都將失敗,無論是默默地或通過拋出TypeError異常(當在 嚴格模式下時,最常見但不排除) 。

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/freeze

你可以考慮一下這樣的:

if(typeof ChuckNorris === 'undefined') { 
    ChuckNorris = Object.create([Infinity], { 
     canCountTo: { 
      value: Infinity * 2, 
      writable: true, 
      configurable: true 
     } 
    }); 

    Object.freeze(ChuckNorris); // nothing can harm Chuck anymore ! 
} 

console.log(ChuckNorris.canCountTo); // Infinity 
delete ChuckNorris.canCountTo; 
console.log(ChuckNorris.canCountTo); // Infinity 

所以基本上,freeze將創建之後設置的對象writableconfigurable標誌爲false。

+0

現在您可以將這些標誌設置爲true了嗎? –

+0

不要誤解我的意思我喜歡這樣:P,但是用JavaScript你永遠不能確定......如果對象可以再次變爲可變的,我不想依賴這個特性。 –

+0

除非有一些我不知道的hackery(不太可能:p),否則當JS引擎原生支持它時,沒有辦法修改凍結對象屬性。 – jAndy

1

不,Object.freeze的想法是你不能再改變它了。根據documentation

本質上,該對象是有效的不可變的。

和:

沒有什麼可以被添加到或從設置凍結對象的屬性中移除。任何試圖這樣做會失敗,...

+0

所以基本上我可以用它來使事情「私人」? –

+0

@Mike Shinola:這取決於你如何定義「私人」。它的值不能改變,但仍然可以讀取。 – pimvdb