对象的isPrototypeOf和静态方法Object.getPrototypeOf
2023-11-24 17:19:09一、如何判断一个对象是普通对象
在研究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,来获取当前对象的原型对象(相当于baseProto.__proto__)。上面isPlainObject方法的内部实现方法很简单,不做详细介绍。
下面主要介绍Object.getPrototypeOf和对象的isPrototypeOf两个方法,如果你不了解原型链,很难理解下面,请进入JavaScript--深入理解__proto__和prototype图解了解原型链
二、object.getPrototypeOf
Object.getPrototypeOf:实际上其实是获取当前对象的原型__proto__([[prototype]])
比如:
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