JavaScript 判断对象类型

JavaScript 判断对象类型

  • 需求

   js日常开发中可能有时候会需要判断这个对象是否是某个类或者是这个类的子类,而对于object对象,js原生的 typeof 函数返回的都是 object 类型,那我们怎么才能判断一个对象实例b( 对象b是类B的实例化,类B继承自类A )的是否是A这个类型呢?

  • instanceof

   如果这个A类型咱们可控的一个类咱们当然可以很简单的调用js原生判断对象从属的方法instanceof,结果是true那么就说明是一个对象,false就不是

    b instanceof A
  • 封装函数

   但是要是这个要是这个B类咱们获取,这个类不是咱们定义的,也不是系统原生提供的,使用刚才的方案就会提示A没有被定义,那怎么办呢

   通过console.log(b)打印日志可以看到如下这个b对象的结构

   他有个__proto__属性,里面有个constructor属性,他的name属性就是这个对象的类型名B

   所以通过b.__proto__.constructor.name就可以获取构造b的类型名称,那么这个名称明显不是A,是不是就说明这个实例不是A对象呢?

   仔细观察一下他的__proto__属性发现里面还有一个__proto__属性,他的constructor.name就是A,由此可见这个b实例是A的子类,再由此类推__proto__.__proto__.__proto__constructor.nameObject是他的终极父类,于是封装一个判断对象是否是某种类型的方法如下

function _instanceof(obj, className) {
    if (!className || typeof className !== 'string') {
        throw new Error()
    }
    if (typeof obj === className) {
        return true
    }
    if (typeof obj !== 'object') {
        return false
    }
    let proto = obj.__proto__
    while (proto && proto.constructor) {
        if (proto.constructor.name === className) {
            return true
        }
        proto = proto.__proto__
    }
    return false
}

   调用示例

class A {}
class B extends A {}
let b = new B()
b instanceof A // true
_instanceof(b, 'A') // true
_instanceof(b, 'B') // true
_instanceof(b, 'object') // true
_instanceof(b, 'C') // false
_instanceof(1, 'number') // true
_instanceof(1, 'object') // false
_instanceof(1, 'A') // false
_instanceof(1, 'B') // false

你可能感兴趣的:(JavaScript 判断对象类型)