Javascript 是否可以扩展已经从另一个类继承的类?
我知道这里的直接答案是否定的,但我和一些人谈过,他们似乎认为这是可能的。这是我的密码:Javascript 是否可以扩展已经从另一个类继承的类?,javascript,inheritance,easeljs,Javascript,Inheritance,Easeljs,我知道这里的直接答案是否定的,但我和一些人谈过,他们似乎认为这是可能的。这是我的密码: var Tile = function(xPos, yPos, state) { this.createTile(xPos, yPos, state); } Tile.prototype = new createjs.Shape(); Tile.prototype.createTile = function(xPos, yPos, state) { // debugger; thi
var Tile = function(xPos, yPos, state) {
this.createTile(xPos, yPos, state);
}
Tile.prototype = new createjs.Shape();
Tile.prototype.createTile = function(xPos, yPos, state) {
// debugger;
this.x = xPos;
this.y = yPos;
this.onState = state;
var fillCommand = this.graphics.beginFill("#969696").command;
var shapeCommand = this.graphics.drawRoundRect(0, 0, 50, 50, 10).command;
this.on("click", function(){this.toggleState(fillCommand);});
stage.addChild(this);
stage.update();
}
Tile.prototype.toggleState = function(fillCommand) {
if (this.onState === true) {
fillCommand.style = "#969696";
stage.update();
this.onState = false;
} else if (this.onState === false) {
fillCommand.style = "#000000";
stage.update();
this.onState = true;
}
}
Shape()是在easeljs中实现的,如果有人熟悉它的话。基本上,我在这里创建了一个Tile类来表示小的圆形正方形,当它们被按下时会改变颜色。语法方面,我没有收到任何错误,网页上没有显示任何内容。我已经有了正确的代码来调用Tile,画布也已经设置好了,或者我也把代码放在这里。我在这里要问的是,我在这个实现中有正确的想法吗?这有点不合常规,但如果它对您有效,那么您将获得更大的权力。从形状继承的更常见方法是执行以下操作
Tile.prototype = Object.create(createjs.Shape.prototype);
Tile.prototype.constructor = Tile;
Javascript中的继承有点奇怪,所以,除非你有时间和精力钻一个深兔子洞,否则我建议你还是坚持到底。如果您确实想阅读更多,这是一篇很好的入门文章:EaselJS contributor here-您完全可以扩展EaselJS类。事实上,这是有原因的。正如其他人提到的,JavaScript继承是一种痛苦,不一定是最好的方法(例如,我总是编写形状/精灵,而不是从它们继承。但这是完全可能的,只要看看EaselJS层次结构:
EventDispatcher>DisplayObject>Bitmap
)
对于您的示例,您可能应该使用教程中的方法,在这里您覆盖初始化,并确保调用了超类版本。这有点脏,但在EaselJS 0.7.1(最新版本)之前一直广泛使用
新方式
更棒的是,CreateJS的最新版本(下一个版本只在GitHub中提供,应该很快标记并发布到CDN!)有一个全新的继承模型,它更容易实现,并且可以自动注入超级方法,包括调用超级构造函数
function MyClass(arg) {
this.EventDispatcher_constructor();
this.doSomethingWith(arg);
}
var p = createjs.extend(MyClass, createjs.EventDispatcher);
// Add new methods
p.doSomethingWith = function() {
// whatever
}
// Override methods
p.addEventListener = function(name, listener) {
this.EventDispatcher_addEventListener(name, listener);
// custom stuff here
}
// Promote super class methods to MyClass
window.MyClass = createjs.promote(MyClass, "EventDispatcher");
这是一种更干净、更易于使用的方法,在我们的测试中效果非常好
希望有帮助:)为什么直接回答是“不”?这看起来像是普通的JavaScript继承。唯一的更改可能是调用
Tile
构造函数中的Shape
构造函数,如createjs.Shape.call(this)
。另外,Tile.prototype=Object.create(createjs.Shape.prototype)
通常是首选。我知道javascript只支持单一继承,这就是为什么我说直接答案是否定的。这是错误的吗?+1这是在javascript中设置原型继承最干净的方法,您可能还需要类似于createjs.Shape.call的东西(this、foo、bar、baz等)代码>函数平铺中的某个位置取决于您的需要。我的问题是,它不会直接给我任何错误,但不会显示。所以我认为我实际上做得不对。下面是CreateJS中关于新类模型的公告:更新我的代码我在var fillCommand=this.graphics.beginll(“#969696”)行上得到一个错误.command;
它告诉我无法读取未定义的属性'Beginll'。我之所以将其作为类实现,是因为最终我将跟踪正在创建的其他分幅,以便打开或关闭它们的状态。这些分幅基本上是正在生成的预制。是否更容易实现不使用我正在尝试的类模型?