* 因为组合式继承会两次调用超类型的构造函数,
* 一次是在创建子类型原型的时候,将超类型的属性添加到自类型的原型上,
* 另一次是在子类型构造函数内部调用,将原型上的属性创建到自己身上,
* 实现屏蔽超类型同名的属性
寄生组合式继承
* 通过借用构造函数继承属性,通过原型链的混成形式继承方法.
* 基本思路:不必为了指定子类型的原型而调用草类型的构造函数,我们所需要的无非就是给超类型原型的一个副本而已.本质上,就是使用寄生式继承来继承超类型的原型,然后将结果指定给子类型的原型.寄生组合式继承的基本模式:
function inheritPrototype(subType,superType) {
var prototype = Object(superType.prototype);//创建对象
prototype.constructor = subType; //增强对象
subType.prototype = prototype; //指定对象
}
* 这个示例中inheritPrototype()函数实现了寄生组合式继承的最简单形式.两个参数,子类型和超类型.
* 在函数内部,
* 第一步:创建一个对象存储着超类型的原型,当做超类型的原型的副本,有着超类型定义在原型中的方法;
* 第二部:创建的副本包含超类型所有的属性,包括constructor,将constructor指向子类型;
* 第三步:将加工完成的超类型的原型给子类型的原型,实现继承.
* 这样省去了SubType.prototype = new SuperType; 省了一次调用超类型的构造函数,而且子类型不在是超类型的实例
//对比组合继承
function SuperType(name) {
this.name = name;
this.color = ['red','green','blue'];
}
SuperType.prototype.sayName = function () {
console.log(this.name);
};
function SubType(name,age) {
SuperType.call(this,name);
this.age = age;
}
inheritPrototype(SubType,SuperType);
// Object.defineProperty(SuperType.prototype,'constructor',{
// value:SuperType,
// enumerable:false
// });
SubType.prototype.sayAge = function () {
console.log(this.age);
};
var instanceSub = new SubType('sub',20);
console.log(instanceSub);
instanceSub.sayName();
var instanceSup = new SuperType('sup');
console.log(instanceSup);
instanceSup.sayName();
instanceSup.sayAge();
但是不明白为什么子类型的prototype.constructor指向SubType正常,
而超类型的prototype.constructor也指向SubType,不应该指向它自己吗?,
而且超类型调用子类型在原型上定义的方法,还不报错。
求求哪位路过的大佬给讲解一二 ^ . ^,不胜感谢!