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

26_面向对象程序设计(原型【九】模拟extjs底层继承方式

程序员文章站 2022-06-15 13:48:24
...

    组合继承存在的问题:两次继承父类的模板,一次继承父类的原型对象

function Person(name, age){
    this.name = name;
    this.age = age;
};

Person.prototype.sayName = function(){
    console.info(this.name);
};

function Boy(name, age, sex){
    //call绑定父类的模板函数,实现 借用构造函数继承,复制了父类的模板
    Person.call(this, name, age);
    this.sex = sex;
};

//原型继承方式:即继承了父类的模板,双继承了父类的原型对象
Boy.prototype = new Person();
var boy = new Boy("z3", 20, "M");
console.info(boy.name);
console.info(boy.age);
console.info(boy.sex);
boy.sayName();

    经典继承方法实现(模拟extjs底层继承机制)

//使用此函数实现只有一次继承原型对象,不继承构造方法
function extend(Sub, Super){
    //目的:实现只继承父类的原型对象
    var F = function(){}; //1 创建一个空函数  目的:空函数进行中转 相当于把原来的Super()中的语句置空
    F.prototype = Super.prototype; //2 实现空函数的原型对象和超类的原型对象转换 
    Sub.prototype = new F(); //3 实现原型继承
    Sub.prototype.constructor = Sub; //4 还原子类的构造器
    
    //保存一下父类的原型对象:一方面解耦,另一方面方便获得父类的原型对象
    Sub.superClass = Super.prototype;
    
    //判断父类的原型对象的构造器
    if(Super.prototype.constructor == Object.prototype.constructor){
        Super.prototype.constructor = Super;
    }
}

function Person(name, age){
    this.name = name;
    this.age = age;
};

Person.prototype = {
    sayName: function(){
        console.info("Person.prototype.sayName(): " + this.name);
    }
};

function Boy(name, age, sex){
    //call绑定父类的模板函数,实现 借用构造函数继承,复制了父类的模板
    Boy.superClass.constructor.call(this, name, age);
    this.sex = sex;
};

//使用extend函数实现继承关系
//在extend函数中只实现一次继承父类的原型对象
extend(Boy, Person);
Boy.prototype.sayName = function(){
    console.info("Boy.prototype.sayName(): " + this.name);
};

var boy = new Boy("z3", 20, "M");
console.info(boy.name);
console.info(boy.age);
console.info(boy.sex);
boy.sayName();
Boy.superClass.sayName.call(boy);


转载于:https://my.oschina.net/u/2317126/blog/387381