当前位置: 首页 > 面试题库 >

为什么使用Object.prototype.hasOwnProperty.call(myObj,prop)代替myObj.hasOwnProperty(prop)?

公羊安怡
2023-03-14
问题内容

如果我理解正确,那么Javascript中的每个对象都是从Object原型继承的,这意味着Javascript中的每个对象都可以通过其原型链访问hasOwnProperty函数。

在阅读require.js的源代码时,我偶然发现了该函数:

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

hasOwn是对的引用Object.prototype.hasOwnProperty。将此功能编写为

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

既然如此,我们为什么要完全定义此功能?是否只是为了获得(少量)性能提升而使用快捷方式和对属性访问进行本地缓存的问题,还是我错过了在没有该方法的对象上使用hasOwnProperty的情况?


问题答案:

[我的示例之间]有什么实际区别吗?

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

这也是更安全的参考Object.prototype.hasOwnProperty()(也更短)。

你可以想象某人可能做了…

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

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

但是,不太可能有人会重写该Object.prototype.hasOwnProperty参考。

既然如此,我们为什么要完全定义此功能?

往上看。

这仅仅是性能访问的快捷方式和属性访问的本地缓存的问题,以(略有)提高性能

从理论上讲,它可能会 更快 ,因为[[Prototype]]不必遵循该链条,但是我怀疑这是可以忽略的,而 不是 实现之所以如此的原因。

…还是我错过了hasOwnProperty可能在没有此方法的对象上使用的任何情况 ?

hasOwnProperty()存在于Object.prototype,但可以被覆盖。每个本机JavaScript对象(但不能保证宿主对象都可以遵循此规则,Object.prototype在链上拥有其最后一个对象null(当然,返回的对象除外Object.create(null))。



 类似资料:
  • 问题内容: 在PHP页面上的表单中,可以使用: 要么 要么 在表单的动作属性中。由于echo 不会传递要使用的变量,而您必须使用,为什么还要使用它呢? 我问是因为我花了一些时间才弄清楚这些变量没有随传递。谢谢。 问题答案: 该属性将默认为当前URL。这是“将表格提交到它来自的地方的最可靠,最简单的方法”。 没有理由使用,并且根本不提交表单(除非附加了事件处理程序来处理提交)。

  • 问题内容: 另一个针对Java的构建工具到底能给我带来什么? 如果您在其他工具上使用Gradle,为什么? 问题答案: 我不会用Gradle来激怒自己(到目前为止只是一个玩具项目) [作者表示,到目前为止,他们仅在一个玩具项目上使用了Gradle,而不是Gradle是一个玩具项目-请参阅评论] ,但我要说的是人们之所以考虑使用它的原因是因为Ant和Maven的挫败感。 以我的经验,Ant通常是只写

  • 问题内容: 该方法(可以接在执行)如下: 我想知道在这种情况下我们可以代替使用吗?喜欢 既然ArrayList类iteself已经是通用的,那么我们可以使用它代替新的通用类型吗? 问题答案: 的要点是,如果所需的数组是的基类。例如,如果为,但所需的数组为。如果被锁定到这是不可能的。 由于类型擦除,在通用集合/类型中不需要这种类型的东西。但是数组没有类型擦除,因此数组的类型非常重要。

  • 问题内容: 在Java中,有人告诉我在执行null检查时应使用==而不是.equals()。是什么原因呢? 问题答案: 他们是完全不同的两件事。比较变量包含的对象引用(如果有)。根据相等性的含义检查两个对象是否相等。根据它们的契约,两个不同的对象实例完全有可能“相等”。还有一个小细节,因为这是一个方法,所以如果你尝试在引用上调用它,则会得到一个。 例如:

  • 问题内容: 为什么我们不能仅将所有测试用例记录在 Selenium IDE中 ,将其导出到 Java / WebDriver 并在带有Eclipse的 WebDriver中 运行呢? 我需要明确的解释,因为我对使用WebDriver非常困惑! 谁能解释为什么IDE录制的脚本在WebDriver中失败? 问题答案: 为什么我们不能只在IDE中记录所有测试用例,将其导出到java / webdrive

  • 问题内容: 编辑: 根据Ulf Rompe的评论, 重要的是使用“ 1”而不是“ 0” ,否则将破坏sys.path。 我已经使用Python已有一段时间了(一年多),对于为什么人们建议您使用而不是,我一直感到困惑。让我示范一下。 假设我正在开发一个名为PyWorkbooks的模块(该模块已安装在我的计算机上),但是同时我正在开发一个包含PyWorkbooks的模块(例如PyJob)。当我在PyJ