Js原型链

110 阅读1分钟

Js原型链

原型链

  • JS的继承机制不同于传统的面向对象语言,采用原型链实现继承,要理解原型链首先要理解原型

原型

  • 原型可以认为它是一个模板或者对象模板,利用原型创建出来的新实例会共享原型的所有方法和属性
  • 所有引用类型都有一个__proto__属性(隐式原型[[prototype]]),指向它构造函数的prototype
  • 所有函数都有一个prototype属性(显式原型),指向当前构造函数的引用地址
  • 当用构造函数实例化(new)一个对象时会将新对象的__proto__指向构造函数的prototype
  • 所有的原型对象(prototype对象)会自动获取一个constructor属性,指向原型对象所在的函数

原型链

  • 原型链是原型创建过程中的历史记录,当访问一个对象的属性时首先会在对象本身的属性中查找,如果没有找到会沿着隐式原型链向上查找,直到找到这个属性或者隐式原型链为null

instanceof

  • instanceof用于判断一个原型对象是不是处于一个对象的原型上(github链接)
function myInstanceof(source: any, target: any): boolean {
    const baseType = ['number', 'boolean', 'string', 'undefined', 'symbol'];
    //判断是否是基本数据类型
    if (baseType.includes(typeof source)) return false;

    let S = source.__proto__;
    const T = target.prototype;

    while (S) {
        if (S === T) return true;
        S = S.__proto__;
    }

    return false;
}

export default myInstanceof;
  • 单元测试结果

image.png