Why Object.prototype.hasOwnProperty.call(myObj, prop)

xx_xx發表於2018-03-17

為什麼使用 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),可以確保呼叫到正確的方法,並且得到?正確的結果。

相關文章