簡體   English   中英

為什么這種方法調用不能在原型中進行?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM