JavaScript是指方法内部的方法吗?

时间:2012-02-07 09:16:18

标签: javascript javascript-objects

好的,刚刚解决了this refered to the wrong scope的一个问题。现在我有另一个问题。

所以我想调用 方法 。但我不知道如何,请查看此来源:

function someObj() {
   var self = this;

   this.someMethod1 = function() {
      var elementBtn = document.getElementById('myBtn');

      elementBtn.onclick = function() { 
         self.someMethod2.methodMethod(); 
         //I want this.someMethod2.methodMethod() to be called
         //...but I get an big error instead. Is it even possible?
         //this.someMethod2() works fine.

      };
   };
   this.someMethod2 = function() {
      this.methodMethod = function() {
         alert('THIS IS THE ONE I WANTED!');
      };
      alert('NO, NOT THIS!');
   };
}

错误消息:

  

未捕获的TypeError:对象函数(){...

5 个答案:

答案 0 :(得分:3)

使用您的代码,someMethod2需要先执行才能分配函数表达式。即使这样,它也会被分配给父实例。

请记住,所有函数都是JavaScript中的对象,而这正是您想要的:

this.someMethod2 = function() {
   alert('NO, NOT THIS!');
};
this.someMethod2.methodMethod = function() {
   alert('THIS IS THE ONE I WANTED!');
};

答案 1 :(得分:2)

您正在尝试在函数上使用对象访问器。如果您希望它以这种方式工作,您需要从调用“外部”函数返回一个对象文字。

this.someMethod2 = function() {
  return {
    methodMethod: function() {
      alert('THIS IS THE ONE I WANTED!');
    }
  }
};

然后,您可以将呼叫链接起来。 self.someMethod2().methodMethod();

答案 2 :(得分:0)

虽然这不是直接可行的,但您可以将“命令”传递给外部函数以告诉它执行内部函数。但是,你确定这是你真正需要的吗?也许你应该在这里使用对象而不是函数。但这是“命令”方式:

this.someMethod2 = function(cmd) {
    var methodMethod = function() {
        alert('THIS IS THE ONE I WANTED!');
    };

    if (cmd === "methodMethod") {
        methodMethod();
        return;
    }

    alert('NO, NOT THIS!');
};

答案 3 :(得分:0)

试图

function someObj() {
 var self = this;

 this.someMethod1 = function() {
  var elementBtn = document.getElementById('myBtn');
  elementBtn.onclick = function() { 
      self.someMethod2().methodMethod(); 
  };

 this.someMethod2 = function() {

  this.methodMethod = function() {
     alert('THIS IS THE ONE I WANTED!');
  };
  alert('NO, NOT THIS!');
  return this;
 };
}

此外,如果您使用原型,那么

function someObj() {
 var self = this;

  this.someMethod1 = function() {
    var elementBtn = document.getElementById('myBtn');
    elementBtn.onclick = function() { 
      self.someMethod2.methodMethod();//['methodMethod'](); 
    };
   };

   this.someMethod2 = function() {


 };
 this.someMethod2.methodMethod = function() {
     alert('THIS IS THE ONE I WANTED!');
   };
 };

但方法 methodMethod 是静态的

答案 4 :(得分:0)

function someObj() {
    var self = this;

    this.someMethod1 = function () {
        var elementBtn = document.getElementById('myBtn');

        elementBtn.onclick = function () {
            self.someMethod2().methodMethod();
        };
    };
    this.someMethod2 = function () {
        this.methodMethod = function () {
            alert('THIS IS THE ONE I WANTED!');
        };
        //return this for chain method.
        return this;
    };
}