JS组合继承

Posted liuxinfuchen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS组合继承相关的知识,希望对你有一定的参考价值。

//定义寄生组合模型
function inherPrototype(SubType,SuperType) {
    var prototype = object.create(SuperType.prototype);
    //create返回一个新的实例,在一个参数时同object()
    SubType.prototype = prototype; 
    prototype.constructor = SubType;
}

function SuperType(name) {
    this.name = name;
    this.color = [‘red‘,‘blue‘,‘green‘];
}
SuperType.prototype.sayname = function () {
    alert(this.name);
}
function SubType(name,age) {
    SuperType.call(this,name);
    this.age = age;
}

inherPrototype(SubType,SuperType);//创建原型链
SubType.prototype.sayage = function () {
    alert(this.age);
}

//object的源码,object和create在传一个参数的时候功能相同,所以我们附上object的源码
function object(o) {
    function F() {}
    F.prototype = o;
    return new F();
}
/*********************************我来分界*****************************************************/
/*********************************我也来分界*****************************************************/
//我们现在进行优化一下,没必要这样自定义函数
function SuperType(name){
    this.name = name;
}
SuperType.prototype.sayname = () => {
    alert(this.name);
}
function SubType(name,age) {
    SuperType.call(this,name);
    this.age = age; 
}

SubType.prototype = object.create(SuperType.prototype);
SubType.prototype.constructor = SubType;
SubType.prototype.sayage = () => {
    alert(this.age);
}

let sub1 = new SubType("xiaohong",18);//现在subtype继承了supetype的属性,
let sub2 = new SubType("xiaoming",19);//而且sub1和sub2这两个实例都有自己的作用域空间,不会影响彼此

/*****************************我是一条分界线=^=*****************************************/
/*****************************我是又一条分界线=^=***************************************/

//现在我们用class来写一下,这里用到了extends方法和super方法
class SuperType{
    constructor(name){
        this.name = name;
    }
    sayname(){
        alert(this.name);
    }
}
class SubType extends SuperType{
    constructor(name,age){
        super(name);
        this.age = age;
    }
    sayage(){
        alert(this.age);
    }
}
/*用class简单的地方在于,我不需要写这么多prototype属性,在定义子类的时候就已经完成了*/
let sub1 = new SubType("xiaohong",18);
let sub2 = new SubType("xiaoming",19);

以上是关于JS组合继承的主要内容,如果未能解决你的问题,请参考以下文章

JS手写面试题 --- 寄生组合继承

JS组合继承

[js高手之路]寄生组合式继承的优势

js组合继承(原型继承+借用构造函数继承)

js 中组合继承

[js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表