对象文字被视为静态对象。
因此,object literal应该只包含静态变量,但在下面的代码中
var obj = {
a : "hello",
foo : function(){
console.log(this.a);
console.log(obj.a);
}
};
我可以以静态方式a
以非静态方式obj.a
访问this.a
。
a
是静态变量吗?
答案 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