2014-10-17 34 views
-1

MDN聲稱通過在對象執行.freezeObject.freeze並不真正凍結

沒有什麼可以被添加到或從設置凍結對象的屬性中移除。

現在來看看這個例子:即使對象是凍結

var span = document.createElement("span"); 
span.id = "foo"; 
console.log(span.id);  //foo 

Object.freeze(span); 
span.setAttribute("id", "bar"); 
console.log(span.id);  //bar 

id屬性更改。通過span.hasOwnProperty("id")我們知道id確實是span的地方財產。

整個DOM只是JavaScript中的一個對象,因此應該防止id被更改。然而它沒有做它的事情。爲什麼?

+1

'setAttribute()'是一個方法調用。 DOM對象上的方法仍然可以在凍結後改變事物。凍結影響純屬性賦值,而不是調用方法和(根據MDN)不是實際上具有getter和setter的屬性。另外,'.freeze()'實際上是爲javascript對象設計的,而不是DOM對象。 – jfriend00 2014-10-17 05:00:14

回答

0

.id仍然被改變的原因是因爲它沒有被改變。它只是看起來已經改變了。 .id最初是用一個setter和getter來定義的,該setter和getter在調用時獲取相應的屬性值。如果預設setter和getter被手動刪除,則該值將不會如預期的改變:

var span = document.createElement("span"); 
delete span.id;  //remove setter and getter 
span.id = "foo"; 
console.log(span.id);  //foo 
Object.freeze(span); 
span.setAttribute("id", "bar"); 
console.log(span.id);  //foo 

實際DOM是從JS輔助性對象分開的,所以getAttribute("id")仍然會返回"bar"