如何在使用对象语法定义的对象中调用兄弟方法?

时间:2011-02-09 16:10:11

标签: javascript

怎么做?

var obj = {
 func1 : function(){
   // Do stuff 
 },
 func2 : function(){
  func1();  // does not work
  this.func1();  // does not work
 }
}

编辑:错过了分号

3 个答案:

答案 0 :(得分:21)

var obj = {
 func1 : function(){
   // Do stuff 
 },
 func2 : function(){
  obj.func1();  // It works fine
 }
}

答案 1 :(得分:7)

如果您想使用'this'关键字,您应该执行类似

的操作
function obj() {
    this.param = whatever;

}

obj.prototype.method1 = function(){
...
}

obj.prototype.method2 = function(){
    this.method1();
}

你可以在obj函数中声明方法,但最好使用原型,因为它更有效 - 无论你创建多少个obj实例,这些函数只存在一次。如果将函数放在obj构造函数中,则obj的每个实例都有自己的函数副本。 javascript做了一些魔术来将方法调用与调用它的对象实例相关联,以确保'this'在上下文中意味着正确的事情

答案 2 :(得分:1)

我不知道为什么提出原始问题的人认为这不起作用。他们的例子确实有效。

var obj = {
 func1 : function(){
   console.log("doing stuff");
 },
 func2 : function(){
  this.func1();  // works fine!
 }
}

您可以将其粘贴到控制台并调用obj.func2(),它就可以了。在这种情况下,您无需为对象命名。

但要小心。如果在func2中定义另一个匿名函数,然后尝试在 函数中使用“this”(例如,如果您正在定义),此解决方案将无效回调)。您将收到“未捕获的TypeError:this.func1不是函数”错误。在这种情况下的问题是“this”不再引用外部对象,它现在指的是新内部函数的上下文。例如:

var obj = {
 func1 : function(){
   console.log("doing stuff");
 },
 func2 : function(){
   var func3 = function () {
     this.func1();  // doesn't work ("this" is no longer obj)
   }
   func3();
 }
}

要解决该问题,您可以保存“this”的本地副本。例如:

var obj = {
 func1 : function(){
   console.log("doing stuff");
 },
 func2 : function(){
   var ourThis = this;
   var func3 = function () {
     ourThis.func1(); // works fine!
   }
   func3();
 }
}