假设我创建了一个像这样的对象
var obj = {M:"soober"};
其[[Prototype]]内部属性指向Object.prototype
。
现在,如果我跑......
Object.seal(Object.prototype);
...这会使程序中的所有对象都不可变吗?
我需要澄清这个问题。
答案 0 :(得分:1)
让我们看看:
> var b = Object.create(Object.seal({}));
> b.foo = 'bar';
> b.foo
"bar"
...这会使程序中的所有对象都不可变吗?
没有
Object.seal()
方法密封对象,防止将新属性添加到对象中,并将所有现有属性标记为不可配置。只要它们是可写的,当前属性的值仍然可以改变。
由于b
不密封(其原型是),因此向其添加新属性没有问题。
答案 1 :(得分:1)
Object.freeze
,而不是Object.seal
对于这些简单的事情,我建议您只需在控制台上试用它们和/或reading the docs
答案 2 :(得分:0)
Object.seal()方法密封对象,防止将新属性添加到对象中,并将所有现有属性标记为不可配置。只要它们是可写的,当前属性的值仍然可以改变。
答案 3 :(得分:0)
prototype
是一个单独的对象,如果在对象本身中找不到这样的属性,则仅查询其属性(依此类推,在原型链下面)。
因此,密封原型只会阻止将新属性添加到原型本身,并且不会影响是否可以将属性添加到从该原型继承的其他对象。