我遇到了Javascript对象文字的问题。
我想在其中一个函数中引用该对象:
var Obj = {
name : "Johnny",
dumb : function() {
alert(this.name);
}
}
可悲的是,“哑”功能也是一个对象。所以,因为dumb()没有 'name'属性,它将返回undefined。
我该如何解决这个问题?
答案 0 :(得分:8)
dumb
是Obj对象的一个方法。调用后,this
将设置为Obj
,并会提醒“Johnny”
var Obj = {
name : "Johnny",
dumb : function() {
alert(this.name);
}
}
Obj.dumb();
答案 1 :(得分:6)
你的代码很好。对dumb
的调用应为:
Obj.dumb(); // "Johnny"
JavaScript中的 this
完全由如何调用函数定义,而不是定义函数的位置。如果通过对象属性调用函数,则在调用this
中将引用该对象。例如,如果你这样做了:
var f = Obj.dumb;
f(); // "undefined"
...然后你得到undefined
(很可能),因为你没有为this
设置任何特定值。在没有特定值的情况下,使用全局对象。 (window
,在浏览器上。)
您还可以使用JavaScript函数的this
或call
功能设置apply
:
var f = Obj.dumb;
f.call(Obj); // "Johnny"
call
(和apply
)的第一个参数是用作this
的对象。 (对于call
,任何后续参数都会传递给函数,因此f.call(Obj, 1);
实际上是Obj.dumb(1);
。对于apply
,第二个参数是数组用作函数的参数,因此f.apply(Obj, [1]);
实际上是Obj.dumb(1);
。)
更多阅读:
答案 2 :(得分:1)
我想我在这里错过了这个问题。你的代码工作正常。
var Obj = {
name : "Johnny",
dumb : function() {
alert(this.name);
}
}
Obj.dumb(); // Alerts 'Johnny'
这是因为在dumb
上调用的Obj
设置为this
。
编辑:如果您执行了以下操作,则为undefined
:
var x = Obj.dumb;
x(); // Alerts ''
这是因为this
现在是window
(因为该函数不再在Obj
上调用)。
您必须.call
:
var x = Obj.dumb;
x.call(Obj); // Alerts 'Johnny'
或.bind
(ECMAScript 5,仅指现代浏览器):
var x = Obj.dumb.bind(Obj);
x.call(); // Alerts 'Johnny'
答案 3 :(得分:0)
JS中的所有东西都是一个对象。 this
不是“被调用的函数”,它是被调用的对象(除非你使用像apply()
这样的东西来搞乱它)。
Obj.dumb();
将this === Obj
,this.name
将解析为"Johnny"
。
请务必致电Obj.dumb()
,不要执行以下操作:
// This won't work
var foo = Obj.dumb;
foo();
... as,虽然foo
与dumb
的功能相同,但上下文不同(this
将是默认对象:window
)。