gpt4 book ai didi

javascript - 为什么使用 Object.prototype.hasOwnProperty.call(myObj, prop) 而不是 myObj.hasOwnProperty(prop)?

转载 作者:IT王子 更新时间:2023-10-29 02:48:18 29 4
gpt4 key购买 nike

如果我理解正确的话,JavaScript 中的每个对象都继承自 Object 原型(prototype),这意味着 JavaScript 中的每个对象都可以通过其原型(prototype)链访问 hasOwnProperty 函数。

阅读时RequireJS ' 源代码,我偶然发现了这个函数:

function hasProp(obj, prop) {
return hasOwn.call(obj, prop);
}

hasOwn 是对 Object.prototype.hasOwnProperty 的引用。将这个函数写成

function hasProp(obj, prop) {
return obj.hasOwnProperty(prop);
}

既然已经到了,为什么还要定义这个函数呢?这只是一个快捷方式和属性访问的本地缓存问题(轻微)性能提升,还是我遗漏了 hasOwnProperty 可能用于没有此方法的对象的任何情况?

最佳答案

Is there any practical difference [between my examples]?

用户可能有一个用 Object.create(null) 创建的 JavaScript 对象,它将有一个 null [[Prototype]]链,因此不会有 hasOwnProperty() 可用。由于这个原因,使用您的第二个表格将无法工作。

它也是对 Object.prototype.hasOwnProperty() 的更安全引用(而且更短)。

你可以想象有人可能已经做了...

var someObject = {
hasOwnProperty: function(lol) {
return true;
}
};

如果它像您的第二个示例那样实现,这将使 hasProp(someObject) 失败(它会直接在对象上找到该方法并调用它,而不是委托(delegate)给 Object .prototype.hasOwnProperty).

但不太可能有人会覆盖 Object.prototype.hasOwnProperty 引用。

And since we are at it, why do we define this function at all?

见上文。

Is it just a question of shortcuts and local caching of property access for (slight) performance gains...

理论上它可能使它更快,因为不必遵循 [[Prototype]] 链,但我怀疑这是可以忽略不计的并且 < em>不是实现的原因就是它的原因。

... or am I missing any cases where hasOwnProperty might be used on objects which don't have this method?

hasOwnProperty() 存在于 Object.prototype 上,但可以被覆盖。每个 native JavaScript 对象(但不保证宿主对象遵循这一点,see RobG's in-depth explanation)将 Object.prototype 作为它在 null 之前链上的最后一个对象(当然除了对于 Object.create(null) 返回的对象)。

关于javascript - 为什么使用 Object.prototype.hasOwnProperty.call(myObj, prop) 而不是 myObj.hasOwnProperty(prop)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12017693/

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