2014-02-12 42 views
1

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

例如:

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

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

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

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

​​3210

当我更改类水果foo的值我也希望它是在食品杂货中改变。

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

我动态创建一个类的实例,他们没有一个明确的变量名(水果,杂货)像例子。

谢谢!

+1

可能重复的[JavaScript中的静态变量](http://stackoverflow.com/questions/1535631/static-variables-in-javascript) – asawyer

回答

9

是的,但是绝对,只是使用功能上本身的属性:

Class.text = 'apple' 

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

考虑到'Class'是函数内部的'this',为什么不传递'this.text'? (除非有人疯了才能做'.bind') –

+1

@GonçaloVieira那是不正确的。 'this'不是函数内的'Class',它是由'Class'构造的对象。 'this.text'不起作用,它将特定于对象,不在对象的所有实例中共享。 – meagar

+0

完美,效果很棒!谢谢! – Ood

1

另一种方法,使用封闭:在这种情况下

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将类似于一个私人静态属性,这是从外面不可用。

+0

这有一个明显更昂贵的缺点,每次构建一个类时,该类都会获得自己独特的一组方法,每个实例都需要额外的处理时间和内存。 – meagar

+0

@meagar我刚刚从OP复制代码。他以这种方式建造了他的班级。当然,他应该使用'prototype',但那不是问题。所以我认为我坚持这个关键部分,这是关于静态属性的问题。 – basilikum

相关问题