8

请查看以下示例:

MyBaseClass = function(a) {
     this.a = a;
};

$.extend(MyBaseClass.prototype, {
    init: function() {
        console.log('I am initializing the base class');
    }
});

MyChildClass = $.extend(MyBaseClass, {
    init: function() {
        MyBaseClass.prototype.init();
        console.log('I am initializing the child class');
    }
});

var = new MyChildClass();
var.init();

Тhis 应该输出“我正在初始化基类”和“我正在初始化子类”。

我需要能够继承类 MyBaseClass,但仍然能够在新的 init() 方法的开头调用他的 init() 方法。

我怎么做?

4

3 回答 3

19

jQuery 的 extend不会构建继承,而是“将两个或多个对象的内容合并到第一个对象中”

使用基于原型的继承来实现您的继承并显式调用“超级”方法:

MyBaseClass = function(a) {
     this.a = a;
};
MyBaseClass.prototype.init = function() {
    console.log('I am initializing the base class');
};

MyChildClass = function(a) {
  this.a = a;
}
MyChildClass.prototype = Object.create(MyBaseClass.prototype); // makes MyChildClass "inherit" of MyBaseClass
MyChildClass.prototype.init = function() {
    MyBaseClass.prototype.init.call(this); // calls super init function
    console.log('I am initializing the child class');
};

var child= new MyChildClass();
child.init();

输出

I am initializing the base class
I am initializing the child class 
于 2013-04-08T09:48:27.680 回答
1

jsFiddle 演示

几件事。extend真的只是增加了属性,它并没有做太多。因此,您需要为您的类准备好一个函数,从基类继承,然后在该类原型上使用扩展。

function MyChildClass(){};
MyChildClass.prototype = new MyBaseClass();
$.extend(MyChildClass.prototype, {
 init: function() {
    MyBaseClass.prototype.init();
    console.log('I am initializing the child class');
 }
});

这是我喜欢用于继承的另一种方法 - 当方法的特异性将成为问题时 - 将基类存储在它自己的属性中

function MyChildClass(){};
MyChildClass.prototype = new MyBaseClass();
MyChildClass.prototype.base = new MyBaseClass();
$.extend(MyChildClass.prototype, {
 init: function() {
    this.base.init();
    console.log('I am initializing the child class');
 }
});
于 2013-04-08T09:53:48.940 回答
1

实现这一目标的另一种基于原型的模式:

MyBaseClass = function(a) {
     this.a = a;
};

MyBaseClass.prototype = {
    init: function() {
        console.log('I am initializing the base class');
    }
};

MyChildClass = function() {};
MyChildClass.prototype = $.extend(new MyBaseClass(), {
    init: function() {
        this.super.init.call(this);
        console.log('init child');
    },
    super: MyBaseClass.prototype,
    constructor: MyChildClass
});

var a = new MyChildClass();
a.init();

输出:

I am initializing the base class
init child

这里this.super存储对基类的引用。

于 2013-04-08T09:58:11.203 回答