【问题标题】:Set prototype of the module in Javascript在 Javascript 中设置模块的原型
【发布时间】:2013-06-03 11:54:15
【问题描述】:

我在一些测试中看到,使用原型方法可以提高代码执行的性能并减少内存消耗,因为方法是按类创建的,而不是按对象创建的。 同时我想在我的类中使用模块模式,因为它看起来更好并且允许使用私有属性和方法。

代码布局如下:

var MyClass = function() {
var _classProperty = "value1";

var object = {
  classProperty : _classProperty
};

object.prototype = {
  prototypeProperty = "value2"
}

return object;
}

但是这种情况下的原型不起作用。我发现原因是为函数而不是对象设置了原型。所以我想我应该使用object.__proto__.prototype 而不仅仅是object.prototype。但是__proto__并非所有浏览器都支持,也不符合ECMAScript5规则。

那么有没有更好的方式在模块模式对象构造函数中使用原型?

【问题讨论】:

标签: javascript constructor module prototype


【解决方案1】:

prototype 属性是您必须在构造函数上设置的属性。并且模块模式使用 IEFE(用于局部变量),它返回“类”构造函数。

var MyClass = (function() {
    var _classProperty = "value1";

    function MyClass() {
        this.instanceProperty = …;
        …
    }

    MyClass.prototype.prototypeProperty = "value2";
    …

    return MyClass;
})();

然后:

var instance = new MyClass;
console.log(instance.instanceProperty);
console.log(instance.prototypeProperty);

【讨论】:

  • 谢谢,这正好回答了我的问题。我认为模块模式的特点是它不需要this关键字。事实证明,我错了。我想知道是否有任何理由将构造函数括在括号中。根据我的测试,在查看此类构造函数创建的对象时,我没有注意到 (function() {})()function() {}() 之间有任何区别。有没有性能提升?
  • 实际上they 在这里是等价的,只是最好通过将其括在括号中来指示 IEFE(以防您看不到下面的调用)。如果没有赋值,这将是一个语法错误……
【解决方案2】:

你必须设置你的构造函数的原型:

var MyClass = function() {
    var _classProperty = "value1";
    this.classProperty = _classProperty;
};

MyClass.prototype = {
    prototypeProperty : "value2"
};

var instance = new MyClass();
console.log(instance.classProperty); //value1
console.log(instance.prototypeProperty); //value2

FIDDLE

编辑

这不是模块模式的实现,而是构造器模式。不过,它允许私有属性和方法(在 JavaScript 允许的范围内)。但是,如果您的目标真的是实现模块模式,请查看 Bergi 的回答。

【讨论】:

  • 这不是模块模式
  • 是的,但是模块模式并不是真正需要实现私有属性和方法。这似乎就是目标。
  • 是的,也许我确实误解了 OP,他并不想制作一个模块......
  • 我也不确定,但从他发布的代码来看,我认为这可能就足够了。另一方面,它在最后一句中确实说的是“模块模式”。好吧,但我想我会保持这种状态。
  • 非常感谢。两个答案都非常相似,并且完全按照我的意愿工作。两种实现之间真的有什么区别吗?模块模式在这里有什么优势吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2011-04-16
  • 1970-01-01
相关资源
最近更新 更多