instanceof

96 阅读1分钟

概念

instanceof运算符用于检测对象的原型链上是否存在构造函数的 prototype属性,即是否存在构造函数的原型对象prototype;有则返回 true,否则返回 false。

  • 语法:object instanceof constructor

    • object:某个实例对象
    • constructor:某个构造函数

用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

function A(){}

function B(){}
B.prototype = new A();
var b = new B();


b instanceof B // true

b instanceof A // true

b.__proto__ === B.prototype // true

b.__proto__.constructor === B // false

b.__proto__.constructor === B.prototype // false

b.__proto__.constructor === A //true



注意:

  • Object.create(null) 会造成创建的对象其 __proto__ 指向为空

实现instanceof

function new_instance_of(leftVaule, rightVaule) {
    let rightProto = rightVaule.prototype;  // 取右表达式的 prototype 值
    leftVaule = leftVaule.__proto__;    // 取左表达式的__proto__值
    while (true) {
        if (leftVaule === null) {
            return false;
        }
        if (leftVaule === rightProto) {
            return true;
        }
        leftVaule = leftVaule.__proto__     // 遍历左表达式的原型链
    }
}