首先实现一个寄生组合继承的最简单函数,这个函数接收两个参数:子类型构造函数和超类型构造函数。
function object(o) {
//首先创建一个临时性的构造函数
function F() {}
//然后将传入的对象作为这个构造函数的原型
F.prototype = o;
//最后返回这个临时类型的新实例
return new F();
}
在传入一个参数的情况下,Object.create()与上方object方法的行为是相同的
function inheritProtoType(subType,superType) {
//创建超类型原型的一个副本
let prototype = Object.create(superType.prototype);
//为创建的副本添加constructor属性,用来弥补因重写原型而失去默认的constructor属性
prototype.constructor = subType;
//将新创建的副本赋值给子类型的原型
subType.prototype = prototype;
}
定义子类型和超类型构造函数,并实现继承。
function SuperType(name) {
this.name = name;
this.colors = ["red","blue","yellow"];
}
SuperType.prototype.sayName = function () {
console.log(this.name)
};
function SubType(name,age) {
SuperType.call(this,name);
this.age = age;
}
inheritProtoType(SubType,SuperType);
SubType.prototype.sayAge = function () {
console.log(this.age);
};
上述SuperType.call(this,name);的意思是使用SuperType对象代替this,并且传了一个name值。
简单测试一下。
let person1 = new SubType("Jack",18);
person1.colors.push("black");
let person2 = new SubType("Tom",19);
console.log(person1);
console.log(person2);
控制台打印结果: