一、如何判斷一個對象是普通對象
在研究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
如果有問題,可告知我,謝謝!