[英]Why doesn't this method call work from within a prototype?
我正在嘗試學習如何編寫更好的javascript,但是我不確定為什么這不起作用。 我有兩個寫入文本字段的方法調用。 第一個可以正常工作,但是第二個則不能。 為什么文本字段變量undefined通過嵌套調用? 任何幫助,將不勝感激:
(function () {
var TestObj = function (logEl) {
this.log = logEl;
};
TestObj.prototype = function () {
var log1 = function (text) {
this.log.val(text);
};
var log2 = function (text) {
log1(text);
}
return {
log1: log1,
log2: log2
};
}();
$(function () {
var logEl = $("#log");
var test = new TestObj(logEl);
test.log1("This Works");
test.log2("This Dosen't"); //this.log is undefined
});
})()
在第二種情況下,將在沒有任何上下文的情況下調用log1。 從log2調用時, this
值將是全局對象,而不是TestObj的實例。
嘗試將其更改為:
var log2 = function (text) {
this.log1(text);
}
我相信問題與在log2
不使用this
有關:
var log2 = function (text) {
this.log1(text);
}
小提琴示例: http : //jsfiddle.net/y66YT/
如DC5和海斯指出的值this
是調用對象。 它是函數之前的對象:
somebutton.click();//this is somebutton
click();//nothing before click, window is assumed or throw exception in strict mode
myObject.doSomething();//this in doSomething is myObject
由於LOG1可通過關閉它不立即拋出一個異常(LOG1是不確定的),但是this
在LOG1功能窗口,因為LOG2未提供調用對象。
要設置調用對象,可以將代碼更改為:
log1.call(this,text);
我不太喜歡將所有東西(包括廚房水槽)都扔到IIFE中,因為它會為每種方法創建不必要的封閉 。 您可以將應用程序包裝為對象文字,而在需要關閉的地方使用IIFE:
var app ={
testObj:function(...
log1將無法通過log2中的閉包使用,但您可以使用this
來調用它
this.log1(text);
更多關於原型,構造函數,繼承和值this
可以找到這里 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.