2013-01-24 35 views
2

对象字面量被视为静态对象。对象字面量和静态变量

因此,对象常量应该只包含静态变量,但在下面的代码段

var obj = { 
    a : "hello", 
    foo : function(){ 
     console.log(this.a); 
     console.log(obj.a); 
    } 
}; 

我可以访问a,以静态方式obj.a和非静态的方式this.a

a是一个静态变量吗?

+0

“对象文字被视为静态对象”。真? – bfavaretto

+0

大多数语言都可以通过'Type.var'和'this.var'引用静态变量。能够使用'this.var'进行引用不会使其非静态。 – mellamokb

+0

@bfavaretto它表现得像单身人士没有?你不能做var b = new obj(); – JohnJohnGa

回答

5

我认为你很困惑一堆不同的东西。

您已创建一个名为obj的对象,其名称为a。该字段可以被访问为obj.a(如果您愿意,可以选择obj['a'])。如果您安排其他变量来引用obj,那么它也可以通过该变量获得。

安排其他变量指向obj的一种方法是将obj的字段定义为函数/闭包,并使用“方法”语法调用它,如obj.foo()中所述。这意味着在foo正文内,在该调用期间,特殊变量this将参考obj。因此,该功能中的代码可以通过this.a访问obj.a

这与静态与动态作用域,单例或“类”与“实例”成员或任何这些都没有任何关系。这只是一个对象。

+3

更重要 - 你可以做一些类似'var func = obj.foo'的文件,并打破'this'引用! – Christoph

1

obj.a是“静态”的,你指的是它的方式。当使用new obj()时,您只会以这种方式使用this - 因此obj必须是一个函数。

默认情况下,this在用作对象成员的函数内引用父对象。在你的代码obj的情况下是父对象。

使用原型和this的一个例子:

var Obj = function(){this.a = "hi"}; 
Obj.prototype.foo = function(){ 
    console.log(this.a); 
} 
Obj.b = "sth"; 
var myObj = new Obj(); 
myObj.foo(); // "hi" 
console.log(myObj.b); // undefined 
3

对象常量是不是一个静态类,它的Object实例;因此obj.a也不能是静态的。或许,困惑之处在于,{}符号确实创建一个对象的事实:

typeof { 
    a : "hello", 
    foo : function(){ 
     console.log(this.a); 
     console.log(obj.a); 
    } 
}; 

"object" 

它等同于:

var obj = new Object(); 
obj.a = 'hello'; 
obj.foo = function() {} 

结论只有

静态属性在类 - 意义面向对象的语言,但是JavaScript中相同的类概念可以说是不存在的。