对象的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

目录

相关推荐
深入理解对象原型__proto__深入理解constructor深入理解原型链JavaScript--原型链图解Object对象中的静态方法setPrototypeOf