JS原型与封闭

Mat*_*ttW 7 javascript

我有一个像这样的JavaScript对象 - 使用闭包来模拟私有和公共函数/变量:

var myCoolObject = function(x, y) {

    var prop1 = "a cool prop1 value";
    var negX = x * -1;
    var negY = y * -1;
    var xyProduct = x * y;

    return {
      PublicProp1: prop1,
      getXYProduct: function() { return xyProduct; },
      getNegX: function() { return negX; },
      getNegY: function() { return negY; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我将创建4000左右这个对象的实例,并从我所读通过添加功能prototype会比添加它们,因为我有以上(更有效,因为在我的例子,每个实例都会有它自己的getXYProcust(),getNegX()getNegY()功能.

我的问题是双重的 - 我上面的方法真的"低效"吗?我意识到低效率是一个相对的术语 - 但这是我可能会注意到的.如果是低效的,我怎么会添加这些功能给prototypemyCoolObject?我尝试了以下方法:

myCoolObject.prototype.protoProp = "pppp";
myCoolObject.prototype.getAtMeBro = function () { return "get at me bro"; };
var myInstance = new myCoolObject(5, 10);
Run Code Online (Sandbox Code Playgroud)

但是当我检查它时,protoProp'getAtMeBro()'都不是属性myInstance.

在此先感谢您的帮助 - 我很感激!

Mat*_*att 3

  1. 最好的建议是尝试一下看看。在现代 JS 引擎中,您应该发现 4,000 个对象是小孩子的游戏,不应该成为问题(前提是每个对象都不会变得太大)。如果您的用户使用 IE6 及较旧的引擎,请做好准备,让他们能够应对更少的问题。

    例如,Facebook 时间轴提要需要约 4000 个(我尝试时为 3992 个)DOM 元素;其中每一个都比您正在创建的对象复杂得多(当然,它们使用原型方法,但它们包含更多信息)。

  2. 使用 's 时不能应用私有成员模式prototype,因为不能创建闭包来封装两者。这里的典型模式是用前导表示私有成员_暗示人们不要使用它(但是当然,没有什么可以阻止他们这样做)。