Object.freeze并没有真正冻结

时间:2014-10-17 04:55:19

标签: javascript dom

MDN声称通过在对象上执行.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 个答案:

答案 0 :(得分:0)

.id仍然被更改的原因是因为它没有被更改。它看起来只是变了。 .id最初使用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"