3

我正在尝试使用函数将 B 类扩展到 A 类,将 A 类扩展到 Super 类。以下代码可以正常工作:

function Super() {
    this.talk = function () {
        alert("Hello");
    };
}

function A() {
    // instance of A inherits Super
    Super.apply(this);
}

function B() {
    // instance of B inherits A
    A.apply(this);
}

var x = new B();
x.talk(); // Hello

但是如果我想让 A 类继承自 Super 类,而不仅仅是它的实例呢?我试过这个:

function Super() {
    this.talk = function () {
        alert("Hello, I'm the class");
    };

    // function of the class' instance?
    this.prototype.talk = function () {
        alert("Hello, I'm the object");
    };
}

function A() {
    // nothing here
}

// A inherits from Super, not its instance
Super.apply(A);


function B() {
    // instance of B inherits A
    A.apply(this);
}

A.talk(); // static function works!

var x = new B();
x.talk(); // but this doesn't...

难道我做错了什么?

4

2 回答 2

4
function Super() { }

// Static method, called by Super.talk()
Super.talk = function () {
    alert("Hello, I'm the class");
};

// Prototype method, should be called by instance
Super.prototype.talk = function () {
    alert("Hello, I'm the object");
};

function A() {
    // 'override' purposes
    Super.apply(this, arguments);
    // ..
}

// A inherits from Super
A.prototype = Object.create(Super.prototype);
A.prototype.constructor = A;

function B() { 
    A.apply(this, arguments);
}

// B inherits from A
B.prototype = Object.create(A.prototype);
B.prototype.constructor = B;

// A.talk() won't work, of course.

var x = new B();
x.talk();
于 2013-09-23T14:06:16.327 回答
1

有两种方法可以将公共属性和方法添加到您的类(而不是函数类):

添加公共属性的方法1,添加到每个实例:

function MyClass(){
      this.publicProperty = 'public property'; 
}

添加公共属性的方法2,添加到原型,所有实例通用:

MyClass.prototype.publicMethod = function(){
      console.log('public method');
}

当您想从 a 继承时,Class您需要继承所有公共属性和方法。

继承使用方法 1 添加的属性和方法:

function MyDerivedClass(){
      MyClass.apply(this);
}

继承使用方法 2 添加的属性和方法:

MyDerivedClass.prototype = Object.create(MyClass.prototype);

因此,在您这样做的情况下Super.apply(A);,您实际上是在向of (通过 1 使用方法 2)添加talk方法。但仅继承使用方法 1 的属性。只需在声明函数后添加以下行:prototypeABAB

B.prototype = Object.create(A.prototype);

事情会如你所愿。希望这会有所帮助。

于 2013-09-23T18:54:43.113 回答