我正在维护一个原作者不再在公司工作的javascript库。
我发现整个图书馆重复了以下模式:
var events = {}; // defined globally
// many lines below within a function:
if(!events.hasOwnProperty.call(events, eventKey)) return;
以这种方式使用call
是否能提供任何技术优势而不仅仅是:
if (!events.hasOwnProperty(eventKey)) return;
我觉得前者不如后者那么直观,而后者则更具表现力,假设输出相同
答案 0 :(得分:1)
两者都是一样的!没有差别。任何对象{}
都有方法hasOwnProperty()
(Object.prototype.hasOwnProperty
),什么是函数(或函数对象),任何函数(-object)都有方法call()
({{ 1}})mdn-docs
Function.prototype.call
的第一个参数是»this context / object«,或context / sidecar / this / that / etc ...
因此,在您的情况下:Function.prototype.call()
与events.hasOwnProperty.call(events, …)
完全相同,因为在第一种情况下events.hasOwnProperty(…)
将是events
,因为它是第一次使用this
的论点。在后一种情况下,call()
也将是events
,因为如果你this
,JS将始终在每个对象的方法上自动设置上下文/。
或代码:
obj.method()