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
被更改。然而,它没有做到这一点。为什么呢?
答案 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"
。