对象文字和静态变量

时间:2013-01-24 14:31:23

标签: javascript

对象文字被视为静态对象。

因此,object literal应该只包含静态变量,但在下面的代码中

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

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

a是静态变量吗?

4 个答案:

答案 0 :(得分:5)

我认为你混淆了许多不同的东西。

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

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

这些与静态与动态范围,单例,或“类”与“实例”成员或其中任何一个无关。这只是一个对象。

答案 1 :(得分: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中相同的类概念可以说是不存在的。

答案 2 :(得分:1)

obj.a是“静态的”,就像你引用它一样。在使用this时,您只能以这种方式使用new obj() - 因此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 :(得分:1)

这不是那么简单,请检查

 let baba = {
    a: 12,
    foo: function () {
        baba.a = 13;
        this.a = 14;
    },
    roo: function () {
        alert("baba.a = " + baba.a + "\nthis.a = " + this.a);
    }
};
var theApp = {
    start_action: function () {

        let sola = Object.create(baba);
        sola.foo();
        sola.roo();

        let bola = Object.create(baba);
        bola.roo();            
    }
}
$(document).ready(theApp.start_action);

在roo()调用之后第一次调用foo,我们得到:13,14 第二次调用foo 13,13