首页 > 解决方案 > 为什么 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__(等)有特殊情况吗?

标签: javascript

解决方案


密封对象锁定在内部[[prototype]]链接中。无论通过哪种方法,您都无法再更改它:

> Object.setPrototypeOf(Object.seal({}), {})
VM2817:1 Uncaught TypeError: #<Object> is not extensible
    at Function.setPrototypeOf (<anonymous>)
    at <anonymous>:1:8

这与 getter/setter 无关。


推荐阅读