【问题标题】:Extending a "class" and exporting it via modules扩展“类”并通过模块导出它
【发布时间】:2016-01-27 16:28:38
【问题描述】:

我正在关注关于 tuts+ 的关于使用easeljs(browserify、bower、grunt)开发游戏的教程。我在我的头上,但我希望完成,但教程工作流程(类模型)的一部分现在已被弃用。这是 createjs 团队不得不说的:http://blog.createjs.com/new-createjs-class-model/

我不太了解,因为我不了解以前的模型,而 TBH 试图让 JS 表现得像 OO 一样可能会很痛苦。

我有基于easeljs 在线演示的main.js 和Button.js。我想扩展easeljs Container并导出Button原型(原型是JS定义类的方式,对吗?)并在main.js中使用(创建实例?)它。

  1. 我应该使用匿名函数来包装 Button.js 文件以避免使用全局范围,还是因为我通过其构造函数导出它而没有必要?

  2. 导出构造函数是导出 JS 类的首选方式吗?

  3. Button.js 中的var p 代表原型?

  4. 如果我要为这个类创建新方法,我会使用p.newMethod = function() {}; 函数表达式吗?当我在 main.js 中创建 Button 实例 (var myButton = new Button("Best button", "green")) 时,我可以这样称呼它们 - myButton.newMethod;?

  5. 非常感谢任何其他更正和有用的轻到中等重量的内容链接。

ma​​in.js

'use strict';

var utils = require('./util/index')
    , domReady = utils.domReady
    , Button = require('./Button');

var c = createjs;

console.log('Game started: EaselJS version: ' + c.EaselJS.version);

domReady(function () {
    var stage = new c.Stage('main');

    stage.addChild(new Button("Best button", "green"));

    stage.update();
});

Button.js

 'use strict';

    module.exports = Button;

    function Button(label, color) {
        this.Container_constructor();
        this.color = color;
        this.label = label;

        this.setup();
    }

    var p = createjs.extend(Button, createjs.Container);

    p.setup = function() {
        var text = new createjs.Text(this.label, "20px Arial", "#000");
        text.textBaseline = "top";
        text.textAlign = "center";

        var width = text.getMeasuredWidth()+30;
        var height = text.getMeasuredHeight()+20;

        text.x = width/2;
        text.y = 10;

        var background = new createjs.Shape();
        background.graphics.beginFill(this.color).drawRoundRect(0,0,width,height,10);

        this.addChild(background, text);
        this.cursor = "pointer";

        this.mouseChildren = false;

        this.offset = Math.random()*10;
        this.count = 0;
    };

    window.Button = createjs.promote(Button, "Container");
  1. 请不要对我说“这个问题太宽泛” - 它尽可能直截了当,非常感谢您的帮助。

【问题讨论】:

    标签: javascript browserify createjs easeljs


    【解决方案1】:

    以下是您的一些问题的答案。我对在 require.js 中使用 CreateJS 内容一无所知,所以我无法回答您的前 2 个问题。

    1. 是的,p 只是对对象原型的引用,由createjs.extend 方法返回。

    2. 您对在原型上创建方法并调用它们的总结是正确的。

    我个人不会采用这样的继承方法。正如您所提到的,JavaScript 中的继承有点混乱,所以只有在有意义时才使用它。在您的情况下,我可能会编写一个包含背景和文本的 Container 实例,并且只需使用 stage.addChild(new Button().container)。我为组合内容使用了名称“容器”来显示上下文,但我可能会发现一些更不可知的东西,例如“实例”或“精灵”。

    【讨论】:

    • 感谢您的指点,我会进一步挖掘。这实际上只是实验性的东西,我正在尝试使用 JS 库使用 OO 方法进行一些游戏开发。在 vanilla JS 中做了一些,但熟悉框架是我目前的目标。额外问题:如何定义原型的字段(属性)以及如何使用对象实例访问它?
    • JavaScript 中的属性可以在原型上定义,但 CreateJS 的最佳实践是在实例上(在构造函数中)定义它们。查看 GitHub 中的源代码:github.com/CreateJS/EaselJS/blob/master/src/easeljs/display/… -- 然后您可以通过实例访问它:myObject.alpha
    猜你喜欢
    • 2019-11-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 2020-06-09
    • 2020-04-25
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多