對象的isPrototypeOf和Object.getPrototypeOf及如何判斷一個對象是普通對象

一、如何判斷一個對象是普通對象

在研究react-redux和redux源碼時,出現一個判斷對象是普通對象方法isPlainObject

function isPlainObject(obj) {
  if (typeof obj !== 'object' || obj === null) return false

  let proto = Object.getPrototypeOf(obj)
  if (proto === null) return true

  let baseProto = proto
  while (Object.getPrototypeOf(baseProto) !== null) {
    baseProto = Object.getPrototypeOf(baseProto)
  }

  return proto === baseProto
}

在這個方法中,通過Object的靜態方法getPrototypeOf,來獲取當前對象的__proto__。上面isPlainObject方法的內部實現方法很簡單,不做詳細介紹。

下面主要介紹Object.getPrototypeOf和對象的isPrototypeOf兩個方法,如果你不瞭解原型鏈,很難理解下面,請進入__proto__和prototype圖解瞭解原型鏈

二、object.getPrototypeOf

Object.getPrototypeOf:實際上其實是獲取當前對象的__proto__

比如:

let a = {};
console.log(a.__proto__ == Object.prototype) //true
console.log(Object.getPrototypeOf(a) == a.__proto__); //true
console.log(Object.getPrototypeOf(a) == Object.prototype); //true

由於a.__proto__ == Object.prototype,所以Object.getPrototypeOf(a)是等於 Object.prototype

三、isPrototypeOf

isPrototypeOf: B.isPrototypeOf(b) 實際上是判斷B是不是在a對象的原型鏈上,如果是,返回true,否則,返回false

這個方法結合實例會方便理解:

let B = function() {};
let b = new B();
console.log(B.prototype.isPrototypeOf(b)); //true
console.log(Object.prototype.isPrototypeOf(b)); //true

以b對象爲開始,進行它的原型鏈分析:

    b.__proto__ == B.prototype

    B.prototype.__proto__ == Object.prototype

    Object.prototype.__protot == null

所以:B.prototype.isPrototypeOf(b)、Object.prototype.isPrototypeOf(b)爲true

之前看到一篇文章中有一個實例:Object.prototype.isPrototypeOf(B) 返回的爲true,他理解的是由於B.__proto__指向Object.prototype,這個說話是錯誤的,正確原因應該是:

現在我們來構建B的原型鏈:

    B.__proto__ == Function.prototype

    Function.prototype.__proto__ == Object.prototype

    Object.prototype.__proto__ == null

所以:Object.prototype.isPrototypeOf(B) 爲true

如果有問題,可告知我,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章