2011-06-02 81 views
0

同一类(对象)据我所知,有在JavaScript静态和非静态数据以JavaScript

var MyObj = function(val) 
{ 
    this.vari = val; 
} 

创建类的两种方法其中val将是一个非静态成员。

然而,

var MyObj = new Object(); 
MyObj.vari = ""; 

这是一个单一的对象,因此在这里它的成员将像静态成员。我的问题是,我们如何在同一个类中同时使用静态和非静态内容?

回答

3

有在JavaScript中没有类,只有对象。

当你创建一个新的对象时,你是从函数原型“扩展”的,而不是函数本身。为了使变量或函数看起来是静态的,你必须将它附加到用于创建对象的函数上,而不是它的原型。

js> var Foo = function(){ this.member = "member"; }; 
js> Foo.staticMember = "staticMember"; 
js> var f = new Foo(); 

js> Foo.member; 
undefined 
js> Foo.staticMember; 
"staticMember" 
js> f.member; 
"member" 
js> f.staticMember; 
undefined 
+0

谢谢。顺便说一下,犀牛? – mihsathe 2011-06-02 16:26:46

+0

类别。我真的只是为了举例而输入它,但我模仿了Rhino repl。 – Jeremy 2011-06-02 16:27:31

2

使用您的第一个例子:

var MyObj = function(val) { 
    this.vari = val; 
}; 

MyObj.var2=value; 

将创建一个新的 “静态” 属性可调用为:

var o = MyObj.var2; 
1

第一个使用匿名函数初始化MyObj变量 - 它不创建类。 MyObj稍后可以用作初始化一个对象字段 - vari的对象构造函数。在面向对象的意义上没有什么“统计”。

第二个创建对象类型的对象并初始化其属性。再一次,没有什么是静态的。

在OOP中,“statis”表示该类的成员,例如,变量和属于类定义的对象。例如,下面的模式演示了这个概念:

function MyClass() { 
    this.objectProperty = "I'm object property"; 
    // the following demonstrates initialization of 
    // the object property from class (static) property: 
    this.varFromStatic = MyClass.classProperty; 
} 
MyClass.classProperty = "I'm class (static) property"; 

var obj = new MyClass(); 
// now obj.varFromStatic contains "I'm class (static) property"