3 回答

TA貢獻1815條經驗 獲得超13個贊
[我的示例之間]有什么實際區別嗎?
用戶可能有一個用創建的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對象(但不能保證宿主對象都可以遵循此規則,請參見RobG的深入說明)Object.prototype將其作為鏈上的最后一個對象null(當然,返回的對象除外Object.create(null))。
添加回答
舉報