如何从对象外部(通过事件)引用javascript中的对象方法?

时间:2011-07-11 21:45:27

标签: javascript oop

我正在创建一个相当复杂的对象,并希望能够从外部操纵对象。我想从click事件中引用特权方法

function myObject(){
   //How do I reference this function?
   this.doSomething = function (action){
        var doing = action;
   }

}

我知道如果我在变量中创建对象,我可以引用该方法,如:

var obj = new myObject();
obj.doSomething('hit keyboard');

但我创建的用于触发此事件的链接是由对象创建的,但是放在对象之外,因此他们不会知道容器变量来引用它。

<a href="#" onclick="doSomething()">Do Something</a>

不起作用,因为doSomething方法当然是对象的一部分,而不是全局函数。我可以重写代码使其成为全局代码,但宁愿避免这样做。

如果这个问题没有意义,我会很乐意让它更清楚。提前谢谢。

5 个答案:

答案 0 :(得分:1)

虽然它将位于全球范围内,并且通常不推荐,但您可以这样做(如果您只是需要让它工作):

function myObject(){
   //How do I reference this function?
   window.doSomething = function (action){ // USE window instead of this !!
        var doing = action;
   }

}

使用window代替this,可以在处理程序中调用它。

答案 1 :(得分:0)

如果已经创建了对象实例,那么您可以说:

<a href="#" onclick="obj.doSomething()">Do Something</a>

否则,

<a href="#" onclick="function () { return new myObject().doSomething(); }">Do Something</a>

答案 2 :(得分:0)

您需要将对象置于全局范围内。试试这个:

window.myObject = {
    doSomething: function(action) {
        alert("Done!");
    }
};

然后你点击

这样的点击事件
<a href="#" onclick="myObject.doSomething()">Do Something</a>

Example

答案 3 :(得分:0)

问题在于对象的实例与页面上的事件应该触发对象功能的元素之间存在脱节。有多种方法可以处理它而不会在全球范围内暴露任何东西。例如,一种方法是通过对象的属性来绑定两者:

为元素提供ID:

<a id="myLink">Do Something</a>

将元素属性添加到object:

function myObject(element){
   this.element = element;

   if (this.element) {
      this.element.onclick = this.doSomething;
   }

   this.doSomething = function () {
         // do stuffs.
   }
}

实例化对象:

var obj = new myObject(document.getElementById('myLink'));

或简化对象定义:

function myObject(element){
   this.element = element;

   if (this.element) {
      this.element.onclick = function () {
         // do stuffs.
      }
   }
}

答案 4 :(得分:0)

要定义问题,您需要在特定对象的单击处理程序中,并且您希望在代码中的另一个对象上调用一个方法,该方法无法直接从您所在的对象中获取。您实际上只有这些选项,你可以选择一个看似最好或似乎最不令人反感的选项:

  1. 您可以使要调用方法的对象位于全局范围内。
  2. 您可以在全局范围内(在父层次结构中或使用某种全局查找)查找要调用方法的对象。它可以通过这种方式完成,而无需向全局范围添加任何更多顶级对象。
  3. 您可以将要调用方法的对象设置为将具有单击处理程序的所有对象上的实例数据,以便您可以从单击处理程序对象的实例数据中引用全局对象。
  4. 您可以通过使用函数闭包声明click处理程序以包含包含对象的参数,并避免使用所有全局数据。