我们知道在es6之前,js没有类和继承的概念,js是通过原型来实现继承的。
在js中一个构造函数默认自带有一个prototype属性, 这个的属性值是一个对象,同时这个prototype对象自带有一个constructor属性,这个属性指向这个构造函数,同时每一个实例 都有一个__proto__属性指向这个prototype对象,我们可以将这个叫做隐式原型
我们在使用一个实例的方法的时候,会先检查 这个实例中是否有这个方法,没有则会继续向上查找这个prototype对象是否有这个方法,刚刚我们说到prototype是一个对象, 那么也即是说这个是一个对象的实例,那么这个对象同样也会有一个__proto__属性指向对象的prototype对象。
扩展:
寄生组合式继承
new 操作符的实现
补充
补充:寄生组合式继承是最理想的 ES5 继承方式,结合了原型链继承和构造函数继承的优点,并避免了在原型链继承中两次调用父构造函数的问题。
new操作符的核心步骤:
- 创建一个新对象,继承构造函数的
prototype;- 以新对象为 this 执行构造函数;
- 若构造函数返回对象则取该对象,否则返回新对象。
// 寄生组合式继承
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 面试官系列



