gpt4 book ai didi

javascript - EaselJS:有人可以解释一下演示中使用的继承模式吗?

转载 作者:数据小太阳 更新时间:2023-10-29 06:02:24 24 4
gpt4 key购买 nike

我正在使用 EaselJS 创建游戏,我想知道是否有人可以解释演示文件中使用的继承模式是如何工作的。具体来说,我正在查看以下文件:https://github.com/CreateJS/EaselJS/blob/master/examples/assets/Ship.js

在第 7 行,Ship 的原型(prototype)设置为 createjs.container()...

var p = Ship.prototype = new createjs.Container();

然后在第 28 行,存储了对原始构造函数的引用:

p.Container_initialize = p.initialize;  //unique to avoid overiding base class

最后,Ship 对象在第 30 行被初始化

p.initialize = function () {
this.Container_initialize();

我正在努力思考这个模式,因为它与我过去遇到的任何事情都不一样。有人可以向我解释为什么您要使用类的实例作为新类的原型(prototype)吗?也许只是给我指向一个解释这种模式的链接?非常感谢这里的任何帮助...我意识到这个问题有点含糊。

最佳答案

I'm trying to wrap my head around this pattern, because it is unlike anything I've come across in the past.

我也没有。它并没有太大的魔力,但他的结构绝对不常见。参见 Correct javascript inheritance以获得正确的模式。

Can somebody explain to me why you would want to use an instance of a class as a new class' prototype?

你不知道。你想使用一个从父类的原型(prototype)对象继承的对象。 Unfortunately many people use new ParConstructor for that - 如果构造函数为空,则效果很好。如果构造函数确实创建了实例属性或有其他副作用,就会造成麻烦。不过,大多数人似乎并未注意到或关心这一点。

explanation of this pattern?

function Ship() {
this.initialize();
}

这只是在新实例(构造函数中的 this)上调用 initialize 方法。我看不出将初始化代码直接放在构造函数中有什么好处,但尽管如此。

var p = Ship.prototype = new createjs.Container();

如上所述,这是设置原型(prototype)链以从Container“类”继承方法。它可能会进行不必要的实例初始化,因此应将其替换为 Object.create称呼。并且它为原型(prototype)创建了一个快捷方式变量。

// constructor:
p.Container_initialize = p.initialize; //unique to avoid overiding base class

在这里,创建了对父构造函数的显式引用。 p 上的initialize 属性是继承Container 原型(prototype),现在它是自己的具有描述性名称的 p 对象的 属性。这是必需的,因为......

p.initialize = function () {
this.Container_initialize();
… // property init stuff

... 这里在原型(prototype)对象上声明了一个自己的initialize 方法,覆盖了继承的方法。不过,现在可以使用该专用属性在当前实例上调用“ super ”初始化代码。这样做是 quite common ,但不是这样用方法。相反,call通常用于在子实例上应用父构造函数。

更好(至少,更熟悉):

function Ship() {
this.initialize();
}

var super_p = createjs.Container.prototype,
p = Ship.prototype = Object.create(super_p);

p.initialize = function() {
super_p.initialize.call(this);
… // property init stuff

或者,也可以不用初始化:

function Ship() {
createjs.Container.call(this);
… // property init stuff
}
Ship.prototype = Object.create(createjs.Container.prototype);

关于javascript - EaselJS:有人可以解释一下演示中使用的继承模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18008421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com