【问题标题】:Same variable across all Instances of a JavaScript ClassJavaScript 类的所有实例中的相同变量
【发布时间】:2014-03-10 22:41:34
【问题描述】:

有没有办法在 JavaScript 类的每个实例中创建某种类型的变量(没有全局变量)?

例如:

function Class(){
  this.foo = 'bar';
  this.setText = setText;
  this.getText = getText;
}

function setText(value){
  this.foo = value;
}

function getText(){
  alert(this.foo);
}

现在我像这样创建同一个类的两个实例:

var fruit = new Class();
var groceries = new Class();

当我在水果类中更改 foo 的值时,我也希望在杂货中更改它。

fruit.setText("apple");
fruit.getText(); //alerts apple
groceries.getText(); //SHOULD also alert apple

我正在动态创建一个类的实例,它们没有像示例中那样明确的变量名称(水果、杂货)。

谢谢!

【问题讨论】:

标签: javascript class variables object


【解决方案1】:

是的,绝对有,只需在函数本身上使用一个属性:

Class.text = 'apple'

Class.prototype.getText = function () { return Class.text; }
Class.prototype.setText = function (text) { Class.text = text; }

【讨论】:

  • 考虑到Class是函数内部的this,为什么不通过this.text呢? (除非有人疯狂到可以发.bind
  • @GonçaloVieira 这不是真的。 this 不是函数内部的Class,它是由Class 构造的对象。 this.text 不起作用,它将特定于对象,而不是在对象的所有实例之间共享。
  • @meagar 你是对的,没看出这不是Class.prototype.text,我的错!
【解决方案2】:

另一种方法,使用闭包:

var Class = (function () {
    var foo = "bar";

    function Class(){
      this.setText = setText;
      this.getText = getText;
    }

    function setText(value){
      foo = value;
    }

    function getText(){
      alert(foo);
    }

    return Class;
}());

var fruit = new Class();
var groceries = new Class();

foo 在这种情况下类似于私有静态属性,不能从外部获得。

【讨论】:

  • 这有明显更贵的缺点;每次构建一个类时,该类都会获得自己独特的一组方法,这涉及每个实例的额外处理时间和内存。
  • @meagar 我刚刚从 OP 复制了代码。他的班级就是这样构建的。当然,他应该使用prototype,但这不是问题所在。所以我认为我坚持最本质的部分,即关于静态属性的问题。
猜你喜欢
  • 1970-01-01
  • 2012-03-08
  • 2017-04-01
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多