javascript - 为什么在 "freezing"之后的document.body对象,我可以修改它的属性?

标签 javascript

Object.freeze()

Values cannot be changed for data properties. Accessor properties (getters and setters) work the same (and still give the illusion that you are changing the value). Note that values that are objects can still be modified, unless they are also frozen. As an object, an array can be frozen whereafter its elements cannot be altered. No elements can be added or removed from it as well.

'use strict'

document.body.innerHTML = "Hello#1";
var frozen = Object.freeze(document.body);

document.body = frozen;
console.log("Same frozen body (First):", document.body === frozen)
console.log(document.body['innerHTML']);

// Why I can modify this property?
document.body.innerHTML = "Hello#2";

console.log("Same frozen body (Second):", document.body === frozen);
console.log(document.body['innerHTML']);

此代码片段使用 gettersetter(此方法失败)

'use strict'

var myObj = {
  a: "Ele#1",
  get innerHTML() {
    return this.a;
  }, 
  set innerHTML(html) {
    this.a = html;
  }
}

myObj = Object.freeze(myObj);
myObj.innerHTML = "Ele";

console.log(myObj);

为什么“卡住”body对象后,我可以修改它的属性?例如,innerHTML

可能我缺乏信息,我不知道!

最佳答案

innerHTML 是一个访问器属性。如果您将 document.body 调试到控制台并深入原型(prototype)链,您可以看到它在 Element 中定义为 get innerHTML()设置innerHTML()

这是一个简单的示例,说明如何实现相同的目标:

var myObj = (function() {
    var html = null;

    return {
        get innerHTML() { return html; },
        set innerHTML(value) { html = value; }
    };
})();

关于javascript - 为什么在 "freezing"之后的document.body对象,我可以修改它的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49679549/

相关文章:

javascript - 如何确保函数中的 jQuery 代码先于其他函数执行

javascript - 如何单击带有按钮的隐藏输入文件的行

javascript - 缩小nodejs服务器端代码有什么好处吗?

javascript - 当整数为某个数字时调整 div 的大小

javascript - 我可以控制有多少选项使选择标签变得可滚动吗?

javascript - 即使应该在那里,也无法访问对象属性

javascript - 使用图像作为背景并应用于同级的 div parent

javascript - 在 Rust web 程序集中访问 UInt8ClampedArray

javascript - 如何访问 svelte 组件内的命名插槽?

javascript - 如何在post请求中快速发送正文