2010-02-01 219 views
1

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

自定义的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。我不能通过原型访问成员,因为我需要一个特定的对象实例。我考虑的唯一可行解决方案是在我的一个脚本中全局创建我的控件。这是最好的方法吗?

+0

为什么'this'指的是div?如果该函数在myControl实例上调用,那么'this'将引用相关实例。 – 2010-02-01 07:07:50

+0

啊,但GEvent调用onEvent关闭myControl实例吗?这听起来像是将它直接存储在DOM对象的事件处理程序中。 – Bruce 2010-02-01 07:11:41

回答

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方法将强制执行的范围内,因此在触发事件中myObj.onEventthis关键字将指向myObj对象实例它可以毫无问题地处理你的代码。

+0

我也喜欢这种方式,如果他不介意不使用原型。 – Bruce 2010-02-01 07:16:48

+0

绑定很好。谢谢! – Matt 2010-02-01 07:49:34

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));