2010-05-30 94 views
2

代碼:的Javascript:將使用原型描述方法

Sorter.prototype.init_bubblesort = function(){ 
    console.log(this.rect_array); 
    this.end = this.rect_array.length; 
    this.bubblesort(); 
} 

Sorter.prototype.init = function(array,sort_type){ 
    this.rect_array = array; 
    this.init_bubblesort(); 
} 

上面的代碼工作正常,但是當我改變初始化函數:

Sorter.prototype.init = function(array,sort_type){ 
    var sort_types = {'bubblesort':this.init_bubblesort, 
       'quicksort':this.init_quicksort, 
       'liamsort':this.init_liamsort}; 
    this.rect_array = array; 
    sort_types[sort_type](); 
} 

的init_bubblesort功能產生錯誤說法this.rect_array是未定義的。我試圖圍繞我的腦袋爲什麼init_bubblesort不再有權訪問其實例的變量。

回答

1

您需要使用call來指定隱式參數(this)。

Sorter.prototype.init = function(array,sort_type){ 
    var sort_types = {'bubblesort':this.init_bubblesort, 
       'quicksort':this.init_quicksort, 
       'liamsort':this.init_liamsort}; 
    this.rect_array = array; 
    sort_types[sort_type].call(this); 
} 

否則,沒有與init_bubblesort方法關聯的對象。

對於setTimeout,請執行:;

var self = this; 
setTimeout(function(){sort_types[sort_type].call(self);}, 1000); 

在回調,這將涉及到窗口,所以我們創建一個單獨的變量(個體經營),這將被關閉。

+0

感謝您的快速回答!在一個輕微的相關說明中,如果我做了window.setTimeout(this.bubblesort,80),我遇到了完全相同的問題嗎?那是window.setTimeout(this.bubblesort ....)似乎也不工作,我懷疑這是一個類似的問題。 – LDK 2010-05-30 20:11:55

+1

賽維LDK,是的,你做。我會更新我的答案以展示如何做到這一點。 – 2010-05-30 20:15:31

1

爲什麼你收到此錯誤是this提到的原因到函數裏面解析成方法屬性的對象。

在第一種情況下,這是Sorter對象,在第二種情況下,它是​​對象,當然這些對象是不一樣的。

要做到這一點,最簡單的方法是爲以下幾點。

Sorter.prototype.init = function (array, sort_type) { 
    var sort_types = { 
     'bubblesort': "init_bubblesort", 
     'quicksort': "init_quicksort", 
     'liamsort': "init_liamsort" 
    }; 
    this.rect_array = array; 
    this[sort_types[sort_type]](); 
} 

作爲替代方案,call可用於「改變」的執行方法的上下文中。

並回答關於其他問題的意見,如果需要推遲排序的執行過程中,你可以做到這一點

Sorter.prototype.init = function (array, sort_type) { 
    var sort_types = { 
     'bubblesort': "init_bubblesort", 
     'quicksort': "init_quicksort", 
     'liamsort': "init_liamsort" 
    }; 
    this.rect_array = array; 
    var that = this; 
    window.setTimeout(function(){ 
     that[sort_types[sort_type]](); 
    }, 80); 
} 

在這種情況下,上下文保持不變。

1

Matthew得到了你的問題,而是看你的代碼中,​​對象似乎有點冗餘給我,如果你只用它來映射功能"foo"前綴爲"init_foo",你可以做一些簡單的:

​​