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

时间:2015-01-28 16:06:16

标签: javascript

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

var obj = {M:"soober"};

其[[Prototype]]内部属性指向Object.prototype

现在,如果我跑......

Object.seal(Object.prototype);

...这会使程序中的所有对象都不可变吗?

我需要澄清这个问题。

4 个答案:

答案 0 :(得分:1)

让我们看看:

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

...这会使程序中的所有对象都不可变吗?

没有

来自MDN documentation

  

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

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

答案 1 :(得分:1)

  1. 对于不变性,您需要Object.freeze,而不是Object.seal
  2. 冻结原型只会阻止原型实例本身发生变异。它不会影响祖先,祖先可能具有改变冻结对象行为的内部状态。类似地,后代不会被冻结,它们仅仅面临定义冻结原型上存在的属性的限制(类似于不可配置的属性)。 And even that restriction can be hacked around(不要这样做)。它的祖先也可能是有状态的
  3. 对于这些简单的事情,我建议您只需在控制台上试用它们和/或reading the docs

答案 2 :(得分:0)

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

答案 3 :(得分:0)

prototype是一个单独的对象,如果在对象本身中找不到这样的属性,则仅查询其属性(依此类推,在原型链下面)。

因此,密封原型只会阻止将新属性添加到原型本身,并且不会影响是否可以将属性添加到从该原型继承的其他对象。