2016-02-23 54 views
-1

谷歌搜索但沒有找到合適的資源來解釋使用啓示模塊模式和this關鍵字之間的區別。啓示模塊模式和簡單構造函數的區別

當使用透出模塊模式,我可以有下面的代碼:

var moduleRevealing = function() { 
    var talk = function() { 
     console.log("Talking...."); 
    }; 
    var walk = function() { 
     console.log("Walking..."); 
    }; 
    return { 
     talk: talk, 
     walk: walk 
    } 
    }; 

    console.log('Module Pattern Object'); 
    console.log(moduleRevealing()); 

現在可以如下使用this關鍵字來實現同樣的事情:

var module = function() { 
    var talk = function() { 
     console.log("Talking...."); 
    }; 
    this.walk = function() { 
     console.log("Walking..."); 
    }; 
    this.talk = talk; 
    }; 
    var mod1 = new module(); 
    console.log('Module Object'); 
    console.log(mod1); 

如何都不同?我只能看到一個區別,那就是__proto;前者指向Object,後者指module

如果有人要的看到代碼 - Fiddle

+0

'moduleRevealing'函數不應該用'new'調用。你從哪裏找到這樣的東西? – Bergi

+0

@Bergi謝謝你指出。我的錯誤,糾正了它。當我返回一個對象時沒有意義。 – Shubh

+0

順便說一句,是的,原型繼承是工廠函數和構造函數之間的所有區別。如果沒有要繼承的屬性,則應使用工廠。 – Bergi

回答

1

在你的簡單例子中沒有區別,但讓我更簡單一點。

var moduleRevealing = function() { 
 
    var talk = function() { 
 
     console.log("Talking...."); 
 
    }; 
 
    var walk = function() { 
 
     console.log("Walking..."); 
 
    }; 
 
    var walkAndTalk = function(){ 
 
     walk(); 
 
     talk(); 
 
    }; 
 
    return { 
 
     talk: talk, 
 
     walk: walk, 
 
     walkAndTalk: walkAndTalk 
 
    } 
 
    };

使用this

var module = function() { 
 
    var talk = function() { 
 
     console.log("Talking...."); 
 
    }; 
 
    this.walk = function() { 
 
     console.log("Walking..."); 
 
    }; 
 
    this.talk = talk; 
 
    this.walkAndTalk = function(){ 
 
     this.walk(); 
 
     this.talk(); 
 
    } 
 
    };

這兩個稍微複雜一些的例子現在,當你重寫他們的方法非常不同的行爲。

var modR = moduleRevealing(); 
 
var mod1 = new module(); 
 
modR.walk = function() {console.log('FAST Walking...");} 
 
mod1.walk = function() {console.log('FAST Walking...");} 
 

 
modR.walk(); // outputs "FAST Walking..." 
 
modl.walk(); // outputs "FAST Walking..." 
 

 
modR.walkAndTalk(); // outputs "Walking ... Talking..." 
 
mod1.walkAndTalk(); // outputs "FAST Walking...Talking..."

需要注意的是,即使當你使用覆蓋顯露的模塊創建一個實例walk()的輸出發生變化,這種變化不是由相關的方法walkAndTalk()回升。其根本原因在於「揭示模塊」模式鼓勵對沒有正確學習this的人不加區別地使用javaScript閉包。請參閱此post of mine以比較模塊模式變體之間的差異。

0

在您的例子,有沒有有效的區別(除了爲constructor等細微之處)都附帶每種方法的新副本返回一個對象。如果talkwalkmodule.prototype的一部分,則會有所不同。

相關問題