Javascript ECMAScript通过对象关联数组w/prototype null?
我看到很多人都这样做Javascript ECMAScript通过对象关联数组w/prototype null?,javascript,ecma262,ecmascript-5,Javascript,Ecma262,Ecmascript 5,我看到很多人都这样做 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" ); } } 我的问题不是每次您希望将对象用作哈希时都测试.hasOwnPropert
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" );
}
}
我的问题不是每次您希望将对象
用作哈希时都测试.hasOwnProperty
,为什么不将对象上的\uuuuu proto\uuuu
设置为null
hash.prototype = null;
hash.__proto__ = null;
for ( var v in hash ) {
// Do not print property `foo`
console.log( v + " is a hash property" );
}
我注意到,\uuu proto\uuu
是不标准的。但这仍然不能回答这个问题
var foo=Object.create(null);
getPrototypeOf(foo)
这不是一个原始问题,但我找不到任何关于将\uuuu proto\uuu
更改为null
以消除必须检查继承的缺点的信息?这种方法有什么问题,似乎使代码更快(不必检查对象的属性)和更干净
†和.prototype
属性,如果您计划将来成为它的子对象。并非所有的JS实现都有\uuuuuuuuuuuuuuuuuuuuuu
,因为它是非标准功能。在“哈希”期间创建[[prototype]]更少的对象以避免基于hasOwnProperty
的检查,没有什么本质上的错误枚举
事实上,我知道的一些库(fuse.js就是其中之一,IIRC)就是这样做的
现在谈谈实际问题:
__proto_uuu是非标准的。看我的。注意IE在IE9之前(包括IE9)是如何不支持proto的。当然,IE9支持Object.create
,因此可以使用Object.create(null)
创建[[Prototype]]的无对象,但仍然保留IE6、IE7和IE8。哦,还有Opera,在ECMA5中有没有标准的方法来改变对象的原型?我不确定这是否回答了这个问题,空函数技巧呢。。。基本问题是,为什么没有人放弃继承,而不是在每个使用点进行测试?我不是第一个想到这个想法的人,而是这个技巧:var foo=Object.create(null,{name:{value:“hello”,enumerable:true});getPrototypeOf(foo)代码>现在原型为空。。。这样做的坏处是什么?现在你不必像我说的那样测试hasOwnProperty
,我不敢说是我首先想到的。只是我找不到其他人在讨论这件事。