javascript - 为什么 Object.seal 允许用户设置器仍然工作,但禁用像 __proto__ 这样的原生设置器?
问题描述
例如,在这个问题中,我认为__proto__
作为一个 setter 意味着Object.seal
不会改变__proto__
setter 的行为,但我错了。
但是,这不适用于常规设置器,例如:
var o = {
get foo() { return this._foo },
set foo(val) { this._foo = val },
}
o.foo = 5
Object.seal(o)
o.foo = 10 // it still works!
console.log(o.foo)
console.log(o._foo)
// but this doesn't work:
o.__proto__ = { n: 5 }
console.log(o.n)
编写 setter 的用户是否希望检查密封/冻结/可扩展状态?在实践中似乎没有多少人这样做。不应该 Object.seal 然后禁用设置器,就像它一样__proto__
?
所以,问题是,__proto__
(等)有特殊情况吗?
解决方案
密封对象锁定在内部[[prototype]]链接中。无论通过哪种方法,您都无法再更改它:
> Object.setPrototypeOf(Object.seal({}), {})
VM2817:1 Uncaught TypeError: #<Object> is not extensible
at Function.setPrototypeOf (<anonymous>)
at <anonymous>:1:8
这与 getter/setter 无关。
推荐阅读
- sql - 测试使用 SQL 连接池和提交的 Node JS 应用程序
- java - 使用 CardLayout Manager 切换页面
- c# - 如何从excel工作表中提取.NET对象
- javascript - 页面加载后,内容脚本未在新选项卡中执行
- python - 如何在需要时激活信号
- ssl - (UndefinedFunctionError) function :ssl.cipher_suites/1 未定义或私有
- ffmpeg - 如何在使用 dynaudnorm 时从音频文件中删除剪辑?
- multithreading - Ararat synapse TTCPBlockSocket 在一个线程中创建和连接,在另一个线程中使用
- angular - 在 Angular 应用程序中将 ag-grid 版本从 V.18.xx 升级到 V.25.3.x
- dbus - 介子 `get_option()` 找到 `/etc/dbus-1/system.d/` 目录