继承:构造函数不运行'

Inheritance: Constructor doesn't run "super"?

本文关键字:运行 构造函数 继承      更新时间:2023-09-26

我在使用JS几个月后遇到了这种行为。由于我的Java背景,我非常困惑:我创建一个类并创建子类。调用子类的构造函数不会调用父类的构造函数。好吧,我读到过这种行为,看起来很正常,对吧?

看这个jsfiddle的例子来帮助我澄清。

因此,为了让我的子类构造函数运行它的每个父构造函数,我添加了以下内容(参见jsfiddle示例 )

好的,这样似乎效果更好。现在,我想知道以下几点;有没有一种方法来指定哪个是父类没有触发它的构造函数?例如,下面运行Node()方法:

GameObject.prototype = new Node();
GameObject.prototype.constructor=GameObject;

(参见更新后的jsfiddle示例)

我忍不住觉得我做得不对。因为我的真实模型是跨7个子类分层的,总共有21个调用我的构造函数(6 + 5 + 4 + 3 + 2 + 1 = 21)。

我做错了什么吗?谢谢你的时间!

你本身没有做错任何事。这是给定代码的预期行为。但是,您可以使用类似于John Resig在"简单JavaScript继承"中描述的方法。关于类似方法的另一个讨论可以在stackoverflow上找到。

总的来说,你做得对。但是你的构造函数在它的实例上创建属性,这些属性被分配给继承构造函数的原型。

例如,

Subclass.prototype.animations在原型上,由Subclass的所有进一步实例共享。从你的代码中,似乎你打算为每个实例重新创建这些animations

如何解决这个问题?根本不要使用构造函数。使用对象字面值和Object.create

var Node = {
    init: function () { this.animations = []; },
    doSomething: function () { console.log(this.animations); }
};
var GameObject = Object.create(Node);
GameObject.doSomethingElse = function () { this.init(); this.doSomething(); }

以与继承相同的方式实例化

var gameObj = Object.create(GameObject);
gameObj.doSomethingElse();

不应该比这更困难。

我的理解是JavaScript不像c++、Java和c#这样的传统语言那样天真地实现类。我认为你可以通过使用JavaScript框架来实现你在Java等语言中习惯的行为。

Moo Tools就是这样一个框架:http://mootools.net

您不需要仅仅为了设置继承链而调用父类的构造函数。见http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html

下面是错误的,运行父类的构造函数只是为了设置原型链

GameObject.prototype = new Node();
GameObject.prototype.constructor = GameObject;

更好的方法是使用代理构造函数来附加原型,而不实例化"超类"。

// Surrogate constructor
var TempCtor = function(){};
TempCtor.prototype = Node.prototype;
// Setup the prototype chain without side effects
GameObject.prototype = new tempCtor();
GameObject.prototype.constructor=GameObject;

你需要确保从子类

中调用父构造函数
function GameObject() {
    // Call the parent's constructor
    Node.call(this);
}

我用一个示例更新了您的jsfiddle,该示例显示了设置继承的正确方法http://jsfiddle.net/2caTD/5/