为什么JavaScript {this}不引用父对象?

时间:2011-09-07 01:05:19

标签: javascript oop this

在制作对象时我假设this会返回对象的实例 - 而不是它似乎是其他东西。这是为什么?

var Obj = { 
    foo : 'value',
    bar : function() { return this.foo; } // Error
    bar : function() { return Obj.foo; }  // Works
}

更新:我必须遗漏某些内容,因为在某些情况下,在对象内部使用this不起作用。为什么这只引用了对象实例有时

4 个答案:

答案 0 :(得分:2)

确实如此。您有语法问题。

使用逗号分隔对象成员

var Obj = { 
    foo : 'value',
    bar : function() { return this.foo; },
}
成员函数this中的

指的是对函数调用的对象的引用。

jsFiddle Example

答案 1 :(得分:2)

在JavaScript函数中this的设置取决于函数的调用方式。

使用示例Obj,假设您更正了语法错误并在属性之间使用逗号:

var Obj = {
  foo : 'value', // needs comma, not semicolon
  bar : function() { return this.foo; }
}

如果您使用Obj上的“点”语法来调用bar函数,则this将自动设置为Obj

Obj.bar(); // this will be Obj

这是确保this最终设置您想要的方式的简单方法。但是,如果您以某种其他方式调用该函数,this可以设置为其他内容:

var nonObjBar = Obj.bar; // get a reference to the function
nonObjBar(); // this will (probably) be `window`, but depends if
             // in strict mode or inside some other function, etc

var Obj2 = { foo: "other foo" };
Obj.bar.call(Obj2); // the .call() method sets this to Obj2
                    // so bar will return Obj2's foo, "other foo"

最后一个示例使用.call()上的Obj.bar方法以允许您将this设置为您喜欢的任何方式来调用该函数(严格模式与非严格模式会影响这适用于某些情况)。

如果你来自像Java这样的语言,那似乎很奇怪,但JavaScript函数不属于任何给定的对象。这个行为很有意义且有目的。

答案 2 :(得分:1)

在“值”之后修复分号后,这似乎有效:

var Obj = { 
    foo : 'value',
    bar : function() { return this.foo; } // Error
};

alert(Obj.bar());   // alerts 'value'

请在此处查看jsFiddle:http://jsfiddle.net/jfriend00/UFPFf/

当您在对象上调用方法时,javascript引擎会将this指针设置为在方法调用期间指向该对象。

答案 3 :(得分:0)

foo之后你不应该有分号。

实际上,当您致电Obj.bar时, 指代Obj

请参阅http://jsfiddle.net/AAkbR/

var Obj = { 
    foo : 'value',
    bar : function () { return this.foo; }
};

alert(Obj.bar() === Obj.foo);

警告为真。