2

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

所以,对象字面量应该只包含静态变量,但是在下面的代码中

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

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

a静态变量吗?

4

4 回答 4

5

我认为你混淆了一堆不同的东西。

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

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

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

于 2013-01-24T14:37:23.300 回答
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 中类的相同概念可以说是不存在的。

于 2013-01-24T14:36:13.723 回答
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
于 2013-01-24T14:32:53.210 回答
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

于 2020-03-06T15:48:49.733 回答