2013-03-14 21 views
0

我想仿效JavaScript類,並都拿出了這個方案...與重複類名Javasctipt類模式

var Random = function(a){ // class name used here 
    var Random = function(a){ // and used again here 
     this.valueOf = function(){ 
      return Math.random() 
     } 
     this.under = function(limit){ 
      return this*limit 
     } 
     this.floor = function(limit){ 
      return Math.floor(this*limit) 
     } 
    } 
    return new Random(a) 
} 

var rnd = Random() 

console.log(rnd*20<<0) 

的命名似乎很傳統的我,在TitelCase和實例類名在camelCase中。我將這個類包裝了兩次,以便我可以返回一個實例,因爲我不喜歡在我的主代碼中使用new Thing

讓我覺得最不尋常的是兩個包裝都使用相同的類名稱。這種模式有什麼技術問題嗎?

有沒有更簡單的方法來實現同樣的事情?

+0

有很多JS類庫 - 其中一些支持類派生和基類訪問。所有好的多態性的東西。不要在這裏重新發明輪子。只是我的兩分錢。 – 2013-03-14 22:36:18

+0

我並不是真的想要一個圖書館,我想要一個我能記住的模式,並且到處使用。 – 2013-03-14 22:37:34

+0

我建議閱讀:http://ejohn.org/blog/simple-class-instantiation/作爲這種可重複使用的模式。 – 2013-03-14 22:41:14

回答

1

這是一個非常低效的模式,因爲它在每次調用時都會創建一個新的構造函數,並且不會影響原型繼承。另外,僅取決於大寫來表示構造函數不適合維護。至少在new Foo()很明顯,一個新的實例正在返回。

如果你不喜歡使用new(我無法理解爲什麼),然後在調用函數中包含構造函數,其名稱指示它們的作用,如newRandom或類似的。

關於代碼,我不知道你爲什麼使用函數表達式而不是聲明。有沒有必要使用相同的名稱,內部功能外一個,其實內在功能並不需要一個名字都:

function X(name) { 
    return new (function(name) { 
    this.name = name; 
    })(name) 
} 

var a = X('a'); 
a.name; // a 

但我不建議你這麼做。