2011-09-22 68 views
3

我在閱讀JavaScript模塊模式。我的問題是如何使與它的子模塊,即我怎麼能繼承它,說我有這個類如何通過模塊模式製作子模塊

var MODULE = (function() { 
    my = function(){ 
      this.params = "" 
     }, 
    privateVariable = 1; 

    my.prototype.moduleMethod = function() { 
     console.log("mod"); 
    }; 

    return my; 
}()); 

如何使一個子類的它的屬性從父遺傳嗎?我怎樣才能做到模塊模式相同?

+0

哦,正如RobG指出的那樣,總是使用var來表示變量,從不忽略它,並且記住它是函數作用域,而不是塊範圍。 – Azder

回答

7

模塊模式不是類模式。你不能簡單地假裝你現在有JavaScript的課程。至於繼承,如果你真的需要繼承東西,你應該通過構造函數創建一個對象並使用原型繼承,儘管它有時候執行起來會比較慢。

作爲創建一個子模塊,它很簡單現在

MODULE.submodule = (function(){ 
    // another module stuff that can even reference MODULE 
    return { submodule: 'property' } 
})(); 

,作爲傳統意義上的子類,你可以用原型模擬它的對象,如道格拉斯·克羅克福德確實http://www.crockford.com/javascript/inheritance.html

對於模擬它模塊,您可以嘗試在原始模塊內創建一個密封/開封功能,並將它們用於子模塊。您可以點擊這裏http://www.pallavlaskar.com/javascript-module-pattern-in-details/

克隆和繼承

var MODULE_TWO = (function (old) { 
    var my = {}, 
     key; 

    for (key in old) { 
     if (old.hasOwnProperty(key)) { 
      my[key] = old[key]; 
     } 
    } 

    var super_moduleMethod = old.moduleMethod; 
    my.moduleMethod = function() { 
     // override method on the clone, access to super through super_moduleMethod 
    }; 

    return my; 
}(MODULE)) 

交叉文件私有狀態

var MODULE = (function (my) { 
    var _private = my._private = my._private || {}, 
     _seal = my._seal = my._seal || function() { 
      delete my._private; 
      delete my._seal; 
      delete my._unseal; 
     }, 
     _unseal = my._unseal = my._unseal || function() { 
      my._private = _private; 
      my._seal = _seal; 
      my._unseal = _unseal; 
     }; 

    // permanent access to _private, _seal, and _unseal 

    return my; 
}(MODULE || {})); 
+0

啊哈!第一個似乎很有前途。第二個看起來有點可怕:) –

+0

請參閱本櫻桃的文章的更多細節:http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html – bob

1
>  var MODULE = (function() { 
>  my = function(){ 

如果不用var聲明它當函數執行時變爲全局。此外,按照慣例構造有開頭大寫字母,所以名稱:

 var My = function(){ 

,但你可能也只是聲明函數,並用它做:

 function My() { 

>    this.params = "" 
>   }, 
>  privateVariable = 1; 
> 
>  my.prototype.moduleMethod = function() { 
>   console.log("mod"); 
>  }; 

如果你只是實現原型繼承,爲什麼要使用模塊模式呢?

> 
>  return my; }()); 

模塊模式並不意味着繼承,而是創建功能的「模塊」,並在某種程度上模擬公共,專有和私有成員。