gpt4 book ai didi

javascript - ECMAScript 关联数组到对象/原型(prototype)为空?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:51:01 24 4
gpt4 key购买 nike

我看到很多人这样做

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 属性,如果您计划让它成为 future 的 child 的话。

最佳答案

创建 [[Prototype]]'less 对象来避免在“散列”枚举期间进行基于 hasOwnProperty 的检查,这本质上没有错

事实上,我知道的一些库(fuse.js 是其中之一,IIRC)就是这样做的。

现在进入实际问题:

  1. __proto__ 是非标准。看我的compat. table .注意 IE 不支持 __proto__ 直到 IE9。当然,IE9 支持 Object.create,因此可以使用 Object.create(null) 创建 [[Prototype]]'less 对象,但 IE6 仍然如此, IE7 和 IE8。哦,还有 Opera <10.10,如您所见(不支持 Object.create)。幸运的是,可以轻松地对 __proto__ 的存在(和功能)进行特性测试,这就是为什么可以让不支持的浏览器采用基于 hasOwnProperty 或其他方式的原因。

  2. 从对象中移除 [[Prototype]] 会“移除”所有 Object.prototype.* 方法。自然。因此,例如,myHash.toString()(甚至 myHash + '')现在将出错,除非您提供该散列 toString 方法. valueOfhasOwnProperty 和所有其他 Object.prototype.* 方法也是如此。当然,这没什么大不了的,因为您始终可以定义这些方法(并且可能应该 — 使它们专门用于哈希使用),但它仍然需要更多工作。

目前还没有找到关于这种方法的任何信息……我至少在 2 年前就在谈论它 :) — http://groups.google.com/group/comp.lang.javascript/msg/9451c45080b5e9f0 (也可能更早,但目前在 comp.lang.javascript 上找不到任何其他帖子)。关于浏览器在该线程中 __proto__ === null 的行为有更多有趣的发现。检查一下。

关于javascript - ECMAScript 关联数组到对象/原型(prototype)为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6159456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com