【问题标题】:Adding a prototype to an object constructor defined in an object literal将原型添加到对象字面量中定义的对象构造函数
【发布时间】:2014-02-09 22:04:34
【问题描述】:

嘿,我里面有一个对象构造函数方法和对象字面量,我为构造函数定义了一个原型,像这样

objectLiteralKey:(function()
{
    var f=function()
    {
        ...
    };

    f.prototype=ObjectInstance;

    return f;
}()),
//inside an object literal

有什么理由应该避免这种定义原型的模式吗?或者也许是另一种更好的方式?

编辑:顺便说一句,对象字面量在一个拥有laserPrototype的自调用函数中,我把它放在那里是因为还有另一个需要相同原型的“敌人”

完整代码http://jsfiddle.net/m2DwT/

【问题讨论】:

  • 什么是eLasersenemy 所属的对象文字是什么,它是单例吗? |看到您的编辑,如果您可以将自调用函数放在那里(并通过用省略号替换它们来省略不必要的部分......)会很好
  • kk,我把不重要的部分删掉了

标签: javascript


【解决方案1】:

有什么理由应该避免这种定义原型的模式吗?

没有。除了可读性,也许吧。

或者也许是另一种更好的方式?

我认为您的代码中有太多不必要的立即调用的函数表达式,您可以省略。将构造函数放在原型之前可能会更好:

var laser = (function () {
    var eLasers = []; // local variable declarations
    var pLasers = []; // for encapsulation

    function Player() {
        this.x = window.player.x; // wait, what? Maybe parameters
        this.y = window.player.y; // would fit better.
        pLasers.push(this);
        this.destroy = function () {
            pLasers.splice(pLasers.indexOf(this), 1);
        }
    }
    function Enemy() {
        …
    }
    // here, Player.prototyp !== Enemy.prototype
    // but I don't think that is really necessary
    Player.prototype.draw = Enemy.prototype.draw = function() {
        ctx.beginPath();
        ctx.arc(this.x, this.y, 5, 0, 2 * Math.PI);
        ctx.stroke();
    };

    return {
        enemy: Enemy,
        player: Player,
        step: …
    }
}())

【讨论】:

    最近更新 更多