欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Javascript继承6:终极继承者----寄生组合式继承

程序员文章站 2022-06-26 20:34:24
设计模式中的经典笔录 ......
/*
* 寄生式继承依托于原型继承,原型继承又与类式继承想象。
* 即: 原型与构造函数的组合继承
* 寄生式继承  继承原型
* 传递参数 childclass 子类
* 传递参数 parentclass 父类
*/

//原型式继承
function inheritobj(obj){
    //声明一个过渡函数对象
    function f(){}
    //过渡对象的原型继承父对象
    f.prototype = obj;
    //返回过渡对象的一个实例,该实例的原型继承了父对象
    return new f();
}

function inheritprototype(childclass,parentclass){
    //复制一份父类原型副本保存在变量中
    var p = inheritobj(parentclass.prototype);
    //修正因为重写子类原型导致子类的constructor属性被修改
    p.constructor = childclass;
    //设置子类原型
    childclass.prototype = p;
}

// 定义父类
function parentclass(name){
    this.name = name;
    this.books = ['html'];
}
//定义父类原型方法
parentclass.prototype.getname = function(){
    console.log(this.name);
}
//定义子类
function childclass(name,time){
    //构造函数是继承
    parentclass.call(this,name);
    //子类新增属性
    this.time = time;
}

// 寄生式继承父类原型
inheritprototype(childclass,parentclass);
//子类新增方法
childclass.prototype.gettime = function(){
    console.log(this.time);
}
// test
var child1 = new childclass('react',2018);
var child2 = new childclass('vue',2017);

child1.books.push('css');

console.log(child1.books)     // ['html','css']
console.log(child2.books)     // ['html']

child2.getname()              // vue
child2.gettime()              // 2017

设计模式中的经典笔录