Javascript对象继承

时间:2010-02-01 06:51:14

标签: google-maps javascript-events oop

我正在为Google地图v2创建一个控件。在创建我的控件时,我发现了设计挑战,并希望找到合适的解决方案。这是货物。

自定义Google控件继承自GControl;

myControl.prototype = new GControl();

接下来我需要重载初始化程序,所以在这里。

 myControl.prototype.initilize = function (map) { 
    //do some work and return stuff

 };

现在在我的自定义控件initlize函数中,我创建了一些元素,使用GEvent类,我订阅了各种事件。为了使我的回调函数可以管理,我将它们包含在控件原型中。

myControl.prototype.onEvent = function(e){
  //do some work;
  //modify the members of the current myControl instance
};

在我的回调函数“onEvent”中,我想修改控件中的成员。 从函数访问我的控件的最佳方法是什么?不能使用关键字“this”,因为这是对单击元素的引用,在我的例子中是div。我无法通过原型访问成员,因为我需要一个特定的对象实例。我考虑过的唯一可行的解​​决方案是在我的一个脚本中全局创建我的控件。这是最好的方法吗?

2 个答案:

答案 0 :(得分:1)

我能想到的最简单的事情是,在构造函数中定义你的onEvent方法,你可以快速访问当前的对象实例,而不必修改你的公共API:

function MyControl () {
  var instance = this; // store a reference to 'this'

  this.onEvent = function (e) {
    // use the instance variable
    instance.otherMethod();
  };
}

请注意,在此方法中,onEvent属性将物理存在于对象实例中(obj.hasOwnProperty('onEvent') = true)。

修改:您只需使用GEvent.bind功能:

GEvent.bind(map, "click", myObj, myObj.onEvent);

上述bind方法将强制执行上下文,因此this内的myObj.onEvent关键字将在事件触发时指向myObj对象实例,它将起作用用你的代码没有问题。

答案 1 :(得分:0)

我不熟悉你如何使用GEvent订阅活动,所以我会把它放到一边。这样做:

myControl.prototype.onEvent = function(e, instance) {
  // do some work
  // modify members of 'instance'
};

function wrap(handler, instance) {
  return function(e) {
    handler(e, instance);
  }
}

GEvent.Register('Event', wrap(instance.onEvent, instance));