JavaScript对象引用

时间:2012-01-12 15:46:59

标签: javascript

我遇到了Javascript对象文字的问题。

我想在其中一个函数中引用该对象:

var Obj = {
    name : "Johnny",
    dumb : function() {
        alert(this.name);
    }
}

可悲的是,“哑”功能也是一个对象。所以,因为dumb()没有 'name'属性,它将返回undefined。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:8)

dumb是Obj对象的一个​​方法。调用后,this将设置为Obj,并会提醒“Johnny”

Try it out

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函数的thiscall功能设置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 === Objthis.name将解析为"Johnny"

请务必致电Obj.dumb(),不要执行以下操作:

// This won't work
var foo = Obj.dumb;
foo();

... as,虽然foodumb的功能相同,但上下文不同(this将是默认对象:window)。