javascript – Object.preventExtensions实际上允许__proto__的变异?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – Object.preventExtensions实际上允许__proto__的变异?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1597字,纯文字阅读大概需要3分钟。
内容图文
![javascript – Object.preventExtensions实际上允许__proto__的变异?](/upload/InfoBanner/zyjiaocheng/801/6972984266354f8ab76ca879daddf027.jpg)
我正在浏览MDC关于添加到Object的新功能.其中一个,Object.preventExtensions,据说可以防止对象原型的突变,这可以通过使用Object.getPrototypeOf或__proto__获得.
然而,在Chrome上,它似乎只是允许突变到对象的原型.这可以通过执行relevant page上的代码来确认:
// EXTENSION (only works in engines supporting __proto__
// (which is deprecated. Use Object.getPrototypeOf instead)):
// A non-extensible object's prototype is immutable.
var fixed = Object.preventExtensions({});
fixed.__proto__ = { oh: "hai" }; // throws a TypeError
我没有得到这个TypeError,并且修复了.__ proto __.哦===’hai’,所以它已被设置,即使它应该被禁止.我也可以在编码像Object.getPrototypeOf(fixed).oh =’hai’时添加它.
这是否意味着Chrome对此功能有不同的解释?如何防止扩展对象的原型(在Chrome中)?
解决方法:
不,Chrome和Mozilla都实现了规范的标准部分相同.仔细读:
Object.preventExtensions
only prevents
addition of own properties. Properties
can still be added to the object
prototype.
与.__ proto__有关的一切都是非标准的,Chrome可以采用不同的方式实现.你只展示了Chrome使用.__ proto__实现细节的方式不同,而且在我看来,更直观:规范说原型仍然是可扩展的,所以你应该仍然能够改变它是有道理的.那么问题就变成了为什么Mozilla以这种方式实现它?
例如,以下代码在Chrome和FF上的工作方式相同:
var fixed = Object.preventExtensions({});
Object.getPrototypeOf(fixed).p = 99;
fixed.p; // 99
很明显,原型仍然是可变的.这对Chrome的.__ proto__的实现很有意义.
因此,为了防止原型的扩展,请单独执行:
var fixed = Object.preventExtensions({});
Object.preventExtensions(Object.getPrototypeOf(fixed));
Object.getPrototypeOf(fixed).p = 99; // TypeError: Can't add property p, object is not extensible
内容总结
以上是互联网集市为您收集整理的javascript – Object.preventExtensions实际上允许__proto__的变异?全部内容,希望文章能够帮你解决javascript – Object.preventExtensions实际上允许__proto__的变异?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。