Javascript 继承:构造函数不';“t运行”;超级;?

Javascript 继承:构造函数不';“t运行”;超级;?,javascript,inheritance,constructor,prototype,chaining,Javascript,Inheritance,Constructor,Prototype,Chaining,在使用JS几个月后,我遇到了这种行为。我非常困惑,因为我的Java背景:我创建一个类并生成子类。 调用子类的构造函数不会调用父构造函数。好吧,我读到过关于这种行为的报道,这似乎很正常,对吧 请参阅此JSFIDLE以帮助我澄清 因此,为了让我的子类构造函数运行它的每个父类构造函数,我添加了以下内容(参见JSFIDLE 好的,这样看起来效果更好。 现在,我想知道以下几点:有没有一种方法可以在不触发其构造函数的情况下指定哪个是超类? 与示例类似,下面运行Node()方法: (参见更新的JSFIDLE)

在使用JS几个月后,我遇到了这种行为。我非常困惑,因为我的Java背景:我创建一个类并生成子类。 调用子类的构造函数不会调用父构造函数。好吧,我读到过关于这种行为的报道,这似乎很正常,对吧

请参阅此JSFIDLE以帮助我澄清

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

好的,这样看起来效果更好。 现在,我想知道以下几点:有没有一种方法可以在不触发其构造函数的情况下指定哪个是超类? 与示例类似,下面运行Node()方法:

(参见更新的JSFIDLE)

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


<>我做了什么错事?谢谢你的时间!

我的理解是JavaScript并没有像C++、java和C语言那样使用传统语言来实现类。我认为你可以通过使用java语言框架来获得你想要的行为。
Moo Tools就是这样一个框架:

您本身并没有做错任何事情。这是给定代码的预期行为。但是,您可以使用类似于中所述的方法。可以找到关于类似方法的另一个讨论。

通常,您做得对。但是您的构造函数会在上创建属性它的实例和那些属性被分配给继承构造函数的原型

子类.prototype.animations
位于原型上,由
子类
的所有其他实例共享。从您的代码来看,似乎您希望为每个实例重新创建这些
动画

如何解决此问题?根本不使用构造函数。使用对象文字和
对象。创建

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();
不应该比这更难


请参阅。

您不需要调用父级构造函数来设置继承链。请参阅

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

GameObject.prototype = new Node();
GameObject.prototype.constructor = GameObject;
更好的方法是使用附加原型的代理构造函数,而不实例化“超类”

您需要确保从子类调用父构造函数

function GameObject() {
    // Call the parent's constructor
    Node.call(this);
}

我用一个例子更新了你的JSFIDLE,这个例子展示了设置继承的正确方法

嘿,听起来不错,我喜欢使用单独的“init”方法。谢谢!所以…不要使用构造函数?这不是解决问题的好方法。正确的方法是使用不同的技术,而不涉及调用父方法构造函数也只是为了设置继承,
this.animations
不是在原型上设置的,而是在对象本身上设置的,写入总是在对象上,而不是在原型上(除非您执行
constructor.prototype.animations=[]
),最后,建议使用
[]
还可以,但更好的建议是使用
{}
,因为OP没有将其用作数组,但实际上它是一个数组map@JuanMendes,
animations
成为
Redhead
原型的一个属性,当他这样做时
Redhead.prototype=newgameobject();
。我将编辑我的答案以表达我的看法(缺少)构造函数。@Katspaugh我明白了,它在原型上,因为它调用构造函数来设置继承,父实例就是附加到原型上的。对不起,我应该意识到…调用父构造函数来设置继承是错误的
// 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);
}