javascript – ECMAScript关联数组通过对象w /原型null?
作者:互联网
我看到很多人这样做
Object.prototype.foo = 'HALLO';
var hash = {baz: 'quuz'};
for ( var v in hash ) {
// Do not print property `foo`
if ( hash.hasOwnProperty(v) ) {
console.log( v + " is a hash property" );
}
}
我的问题是,而不是每次想要使用Object作为哈希时测试.hasOwnProperty为什么不在对象上将.__ proto__设置为null? †
hash.prototype = null;
hash.__proto__ = null;
for ( var v in hash ) {
// Do not print property `foo`
console.log( v + " is a hash property" );
}
我注意到__proto__是非标准的.虽然……仍然没有回答这个问题
var foo = Object.create(null);
Object.getPrototypeOf(FOO);
这不是一个原始问题,但我找不到任何关于将__proto__更改为null以消除必须检查继承的缺点?这种方法有什么问题,似乎使代码更快(不必检查Object的属性)和更干净?
†和.prototype属性,如果你打算制作它的未来孩子.
解决方法:
在“哈希”枚举期间创建[[Prototype]]’较少的对象以避免基于hasOwnProperty的检查没有任何内在错误.
事实上,我所知道的一些库(fuse.js就是其中之一,IIRC)正是如此.
现在谈到实际问题:
> __proto__是非标准的.请参阅我的compat. table.注意IE在IE9之前不支持__proto__.当然,IE9支持Object.create,因此可以使用Object.create(null)创建[[Prototype]]’较少的对象,但仍然留下IE6,IE7和IE8.哦和Opera< 10.10,你可以看到(它不支持Object.create).幸运的是,__ proto__的存在(和功能)可以很容易地进行功能测试,这就是为什么可以使非支持浏览器采用基于hasOwnProperty或其他路由的原因.
>从对象中删除[[Prototype]]“删除”所有Object.prototype.*方法.自然.因此,例如,myHash.toString()(甚至myHash”)现在将错误输出,除非您将该散列赋予toString方法.同上valueOf,hasOwnProperty和所有其他Object.prototype.*方法.当然,这并不是什么大问题,因为你总是可以定义这些方法(并且可能应该 – 使它们专门用于哈希使用),但它仍然是更多的工作.
到目前为止还没有找到任何关于这种方法…我至少在2年前谈论它:) – http://groups.google.com/group/comp.lang.javascript/msg/9451c45080b5e9f0(可能更早,但目前在comp.lang.javascript上找不到任何其他帖子).关于浏览器在该线程中使用__proto__ === null的行为,有更多有趣的发现.看看这个.
标签:javascript,ecmascript-5,ecma262 来源: https://codeday.me/bug/20190626/1295810.html