亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么使用Object.prototype.hasOwnProperty.call

為什么使用Object.prototype.hasOwnProperty.call

智慧大石 2019-11-26 10:51:29
如果我理解正確,那么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的情況?
查看完整描述

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))。


查看完整回答
反對 回復 2019-11-26
  • 3 回答
  • 0 關注
  • 5666 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號