超级()调用的Javascript继承
我有一些共享大部分初始化的伪类。我决定取出这个初始化并创建一个基类,它们将继承它。超级()调用的Javascript继承
function BaseClass(param1, param2) {
...
}
function SubClassA(param1) {
...
}
function SubClassB(param1) {
...
}
我想SubClass1
和SubClass2
从BaseClass
以下方式继承:
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问题。 (免责声明:有人问我旁边。)
我有类似的东西,我这样做:
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类:
- 这是矩形的子类。
- 它包含一个构造函数,没有其他方法。
-
它可以使用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());
你该死忍者的区域! ;) – kiswa 2012-04-04 14:26:53
啊,call()没有出现在我的脑海里。好的,谢谢;)@ kiswa,如果你不介意,我会接受taskinoor,因为他是第一张海报:) – Imp 2012-04-04 14:33:31
似乎对我来说很公平。但随时都可以赞同!;)另外,如果您有兴趣,我还会添加一个链接到MDN以获得更多详细信息。 – kiswa 2012-04-04 14:34:54