Object.seal(Object.prototype)是否使所有对象不可变?

Does Object.seal(Object.prototype) make all objects immutable?

本文关键字:Object 对象 不可变 是否 seal prototype      更新时间:2023-09-26

假设我创建了一个这样的对象

var obj = {M:"soober"};

它的[[原型]]内部属性指向Object.prototype

现在,如果我跑...

Object.seal(Object.prototype);

。这是否使程序中的所有对象都不可变?

我需要澄清一下这个问题。

让我们看看:

> var b = Object.create(Object.seal({}));
> b.foo = 'bar';
> b.foo
  "bar"

。这是否使程序中的所有对象都不可变?

不。

从 MDN 文档:

Object.seal() 方法密封对象,防止向对象添加新属性,并将所有现有属性标记为不可配置。只要当前属性的值是可写的,它们仍然可以更改。

由于b不是密封的(它的原型是密封的),因此向其添加新属性没有问题。

  1. 对于不可变性,您需要Object.freeze,而不是Object.seal
  2. 冻结原型只能防止原型实例本身发生突变。它不会影响祖先,祖先可能具有改变冻结物体行为的内部状态。同样,后代不会被冻结,它们只是在定义冻结原型上存在的属性时面临限制(类似于不可配置的属性)。甚至这种限制也可以被黑客入侵(不要那样做)。它的祖先也可能是有状态的

对于这些简单的事情,我建议简单地在控制台上尝试它们和/或阅读文档

Object.seal() 方法密封对象,防止向对象添加新属性,并将所有现有属性标记为不可配置。只要当前属性的值是可写的,它们仍然可以更改。

prototype是一个

单独的对象,只有在对象本身(依此类推,在原型链中)找不到此类属性时,才会查询其属性。

因此,密封原型只会阻止将新属性添加到原型

本身,而不会影响是否可以将属性添加到从该原型继承的其他对象。