超级()调用的Javascript继承

问题描述:

我有一些共享大部分初始化的伪类。我决定取出这个初始化并创建一个基类,它们将继承它。超级()调用的Javascript继承

function BaseClass(param1, param2) { 
    ... 
} 

function SubClassA(param1) { 
    ... 
} 

function SubClassB(param1) { 
    ... 
} 

我想SubClass1SubClass2BaseClass以下方式继承:

SubClassA(param1)构造函数调用BaseClass(param1, "I am A.")

SubClassB(param1)构造函数调用BaseClass(param1, "I am B.")

所以BaseClass增加了一些特性给他们。然后这两个子类自己进行初始化。

现在我不能只做SubClassA.prototype = new BaseClass(),因为我想要超级构造函数来获取参数。如何优雅地做到这一点?

function SubClassA(param1) { 
    BaseClass.call(this, param1, "I Am A."); 
} 

function SubClassB(param1) { 
    BaseClass.call(this, param1, "I Am B."); 
} 

当你做一个new SubClassA(param1)new SubClassB(param1)基类的构造将与适当的参数来调用。

此外,还有其他方法可以定义基类,而不是SubClassA.prototype = new BaseClass()。有关详细信息,请查看this问题。 (免责声明:有人问我旁边。)

+0

你该死忍者的区域! ;) – kiswa 2012-04-04 14:26:53

+0

啊,call()没有出现在我的脑海里。好的,谢谢;)@ kiswa,如果你不介意,我会接受taskinoor,因为他是第一张海报:) – Imp 2012-04-04 14:33:31

+0

似乎对我来说很公平。但随时都可以赞同!;)另外,如果您有兴趣,我还会添加一个链接到MDN以获得更多详细信息。 – kiswa 2012-04-04 14:34:54

我有类似的东西,我这样做:

function SubClass (param1) { 
    BaseClass.call(this, param1, "I am A."); 
} 

这给我的BaseClass的​​实例对象的所有属性。

编辑:这是关于the call function的一些信息。这很有用,因为您可以指定呼叫期间的内容this并提供参数列表。

我做了目的的JavaScript帮手称为Class.js - https://github.com/eppz/eppz-js - 索利因为这个原因(没有任何额外的样板代码申请,也减少了原型麻烦)。

使用它可以很容易地使这个设置为:

var BaseClass = Class.extend 
({ 
    param1: null, 
    param2: null, 

    construct: function(param1, param2) 
    { 
     this.param1 = param1; 
     this.param2 = param2; 
    }, 
}); 

var SubClassA = BaseClass.extend 
({ 
    construct: function(param1) 
    { 
     this.super.construct(param1, 'This is A.'); 
    }, 
}); 

var SubClassB = BaseClass.extend 
({ 
    construct: function(param1) 
    { 
     this.super.construct(param1, 'This is B.'); 
    }, 
}); 

var a = new SubClassA('A stuff.'); 
var b = new SubClassB('B stuff.'); 

console.log(a.param1); // A stuff. 
console.log(b.param1); // B stuff. 

console.log(a.param2); // This is A. 
console.log(b.param2); // This is B. 

添加的面积法,以矩形的prototype.Create满足下列一个Square类:

  1. 这是矩形的子类。
  2. 它包含一个构造函数,没有其他方法。
  3. 它可以使用Rectangle类区域的方法来打印广场

    class Rectangle { 
    
        constructor(w, h) { 
        this.w = w; 
        this.h = h; 
        } 
    } 
    Rectangle.prototype.area = function() 
    { 
        var a = this.w * this.h; 
        return a; 
    } 
    class Square extends Rectangle{ 
        constructor(r) { 
         super(r, r) 
         } 
        } 
    
        const rec = new Rectangle(3, 4); 
        const sqr = new Square(3); 
    
        console.log(rec.area()); 
        console.log(sqr.area());