2010-02-01 92 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));