讓我們看看幾個問題:
- 的
alertx()
沒有收到event
說法。
- 在該功能中,您使用
this
致電getMouseXY
。此時的關鍵字將引用觸發事件的元素。
- 您正在將事件處理程序綁定到未知的
object
變量。
我想你想要做這樣的事情:
function getMouseXY(event){
var x = event.clientX - this.offsetLeft, // notice, 'this' is used
y = event.clientY - this.offsetTop;
return [x,y];
}
function alertx(event){
var c = getMouseXY.call(this, event); // set the element as 'this'
alert(c[0]);
}
如果你有一個構造函數,和上面的功能是實例方法,你可以這樣做:
function MyObject() { // constructor
}
MyObject.prototype.getMouseXY = function (event) {
var x = event.clientX - this.offsetLeft,
y = event.clientY - this.offsetTop;
return [x,y];
};
MyObject.prototype.alertx = function (event, element) {
var c = this.getMouseXY.call(element, event);
alert(c[0]);
}
當綁定的情況下,你可以添加一個匿名函數,執行上下文:
var object = new MyObject();
document.getElementById('cbackground').addEventListener('mouseup', function (e) {
object.alertx(e, this); // alertx will be called with the correct 'this'
}, false);
編輯:在回答您的意見,你只需要知道如何在上下文(this
關鍵字)設置隱含:
當你調用像一個實例方法:
obj.method();
的method
內的this
關鍵字,將參考到obj
。
同樣的事情發生,當你調用全局變量,因爲它們(在瀏覽器腳本window
)全局對象的成員:
globalFunction();
等同於:
window.globalFunction();
和上下文該函數內部將是全局對象本身(window
)。
var instance = new MyConstructor();
在這種情況下的this
關鍵字將是一個新對象,通過使用new
運營商的創建:
另一種情況,當你使用new
操作發生。
當你使用一個函數作爲事件處理程序,該this
關鍵字將參考元素塔觸發事件:
document.getElementById('myId').onclick = obj.myFunction;
在這種情況下myFunction
是obj
一個實例方法,但this
關鍵字將請參閱已被點擊的DOM元素。
最後,因爲你在我的代碼所看到的,上下文可以通過使用call
或apply
設置明確。
驚人的人,謝謝!.call解決了這個問題,我會更多地瞭解它,我有一個構造函數,這些函數是它的方法,這種情況下原型的優點是什麼? – 2009-12-08 19:50:27
Humm。我修改了代碼以使其符合原型模型(構造函數,通過原型添加方法,您的第二種情況),並且我得到了「this.getmouseXY is undefined」。 – 2009-12-17 01:01:53
@Gabriel:您可以發佈代碼,在你的問題或http://jsbin.com? – CMS 2009-12-17 01:38:10