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
    ,我不敢说是我首先想到的。只是我找不到其他人在讨论这件事。