0
点赞
收藏
分享

微信扫一扫

寄生组合继承


* 因为组合式继承会两次调用超类型的构造函数,
* 一次是在创建子类型原型的时候,将超类型的属性添加到自类型的原型上,
* 另一次是在子类型构造函数内部调用,将原型上的属性创建到自己身上,
* 实现屏蔽超类型同名的属性

寄生组合式继承
* 通过借用构造函数继承属性,通过原型链的混成形式继承方法.
* 基本思路:不必为了指定子类型的原型而调用草类型的构造函数,我们所需要的无非就是给超类型原型的一个副本而已.本质上,就是使用寄生式继承来继承超类型的原型,然后将结果指定给子类型的原型.寄生组合式继承的基本模式:

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,不应该指向它自己吗?,

而且超类型调用子类型在原型上定义的方法,还不报错。

求求哪位路过的大佬给讲解一二 ^ . ^,不胜感谢!

寄生组合继承_超类


举报

相关推荐

0 条评论