為什麼使用 Object.prototype.hasOwnProperty.call(myObj, prop) 而不是 myObj.hasOwnProperty(prop)?
標題太長了,掘金貌似不能支援這麼長的標題,就只能把標題放在正文了。
複製程式碼
這是我昨天在閱讀 Airbnb 的 Javascript 風格指南的時候,閱讀到其中有一條:
Do not call Object.prototype methods directly, such as hasOwnProperty, propertyIsEnumerable, and isPrototypeOf.
// bad console.log(object.hasOwnProperty(key)); // good console.log(Object.prototype.hasOwnProperty.call(object, key)); // best const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope. /* or */ import has from 'has'; // https://www.npmjs.com/package/has // ... console.log(has.call(object, key)); 複製程式碼
當時在想為什麼呢,第一時間想到的就是:
這個例項有可能重寫了 hasOwnProperty 等方法,當然這也是最主要的原因了。
然後還提到說:
如果使用 Object.create(null) 建立的物件是沒有prototype的,所以是沒有任何方法的,這種情況下,呼叫上述方法只會得到 undefined
。
這顯然不是想要的結果,所以,使用 Object.prototype.hasOwnProperty.call(myObj, prop),可以確保呼叫到正確的方法,並且得到?正確的結果。