继承:构造函数不运行'
Inheritance: Constructor doesn't run "super"?
我在使用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/
- ES6构造函数返回基类的实例
- 使用Google Visualization动态调用构造函数
- javascript中对象构造函数中的var属性与this.properties
- 理解typescript中的构造函数接口
- 为什么构造函数不是构造函数
- 如果在构造函数中有“返回”,则在 JavaScript 中的新运算符中做了什么
- 未能运行构造函数:TypeError:对象#<对象>没有方法'addPlugin'
- 属性在我的自定义构造函数中无法正常运行 - Javascript
- 如何在运行时访问typescript类公共属性(调试)?只有构造函数和函数是可访问的
- 这个对象构造函数阻止我的脚本运行
- 在构造函数之后运行其他操作
- 继承构造逻辑,但在创建 Sub 对象时运行超级构造函数
- JS构造函数的运行顺序
- 原型链接、调用父方法的行为就像父构造函数从未运行过一样
- 在扩展类中运行构造函数
- 继承:构造函数不运行'
- MobX -运行一个存储的构造函数在另一个
- Js es6类的构造函数运行前先实例化构造函数
- Javascript:如何在覆盖子类中的继承方法后运行父类的构造函数逻辑
- 构造函数:其中“公共”属性在运行时位于内存中