Object.seal(Object.prototype)是否使所有对象不可变?
Does Object.seal(Object.prototype) make all objects immutable?
假设我创建了一个这样的对象
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
不是密封的(它的原型是密封的),因此向其添加新属性没有问题。
- 对于不可变性,您需要
Object.freeze
,而不是Object.seal
- 冻结原型只能防止原型实例本身发生突变。它不会影响祖先,祖先可能具有改变冻结物体行为的内部状态。同样,后代不会被冻结,它们只是在定义冻结原型上存在的属性时面临限制(类似于不可配置的属性)。甚至这种限制也可以被黑客入侵(不要那样做)。它的祖先也可能是有状态的
对于这些简单的事情,我建议简单地在控制台上尝试它们和/或阅读文档
Object.seal() 方法密封对象,防止向对象添加新属性,并将所有现有属性标记为不可配置。只要当前属性的值是可写的,它们仍然可以更改。
prototype
是一个单独的对象,只有在对象本身(依此类推,在原型链中)找不到此类属性时,才会查询其属性。
因此,密封原型只会阻止将新属性添加到原型本身,而不会影响是否可以将属性添加到从该原型继承的其他对象。
相关文章:
- 如何使用object.assign()从其他对象引用基本对象属性
- JSON.stringify和Object.keys在同一个对象上产生不同的结果
- 在使用object.create创建的对象中使用super
- JavaScript-从对象数组中输出随机OBJECT
- 什么是“;原型;通过JavaScript中的Object Literal Notation创建的对象的链接
- 'object对象'在firefox中,wehn引用了jquery
- 在 JavaScript 中依赖全局本机对象是否安全,尤其是 Object 对象
- 为什么 Object 对象中的某些属性不会在子对象中继承
- 设计:为什么JavaScript有单独的Function和Object对象,以及为什么它们有自己单独的原型对象
- 带有外部依赖项的Jasmine单元测试指令失败,类型错误:'[object对象]'
- (Object对象)没有方法效果
- 是object.x和object.y对象's在浏览器中的位置
- Object对象数组Json.字符串数组的字符串化
- Node.js Object对象没有方法'hasOwnProperty'
- 当试图为href获取attr时获取#[object对象]
- object对象转换为字符串数组
- 在Angular2应用程序中渲染JSON对象会得到“object”对象
- JSON返回Object对象
- 用一个所有对象都可以使用的函数扩充Object对象
- Knockout Javascript选择返回Object对象