我们知道在es6之前,js没有类和继承的概念,js是通过原型来实现继承的。

在js中一个构造函数默认自带有一个prototype属性, 这个的属性值是一个对象,同时这个prototype对象自带有一个constructor属性,这个属性指向这个构造函数,同时每一个实例 都有一个__proto__属性指向这个prototype对象,我们可以将这个叫做隐式原型

我们在使用一个实例的方法的时候,会先检查 这个实例中是否有这个方法,没有则会继续向上查找这个prototype对象是否有这个方法,刚刚我们说到prototype是一个对象, 那么也即是说这个是一个对象的实例,那么这个对象同样也会有一个__proto__属性指向对象的prototype对象。

扩展:

寄生组合式继承

new 操作符的实现

补充

补充:寄生组合式继承是最理想的 ES5 继承方式,结合了原型链继承和构造函数继承的优点,并避免了在原型链继承中两次调用父构造函数的问题。new 操作符的核心步骤:

  1. 创建一个新对象,继承构造函数的 prototype;
  2. 以新对象为 this 执行构造函数;
  3. 若构造函数返回对象则取该对象,否则返回新对象。
// 寄生组合式继承
function inherit(Sub, Super) {
  Sub.prototype = Object.create(Super.prototype)
  Sub.prototype.constructor = Sub
}

// 自定义 new
function myNew(Ctor, ...args) {
  const obj = Object.create(Ctor.prototype)
  const ret = Ctor.apply(obj, args)
  return ret instanceof Object ? ret : obj
}

来源整理自:vue3js.cn 面试官系列