Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以扩展已经从另一个类继承的类?_Javascript_Inheritance_Easeljs - Fatal编程技术网

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'。我之所以将其作为类实现,是因为最终我将跟踪正在创建的其他分幅,以便打开或关闭它们的状态。这些分幅基本上是正在生成的预制。是否更容易实现不使用我正在尝试的类模型?