2009-11-26 89 views
0

好的。我有這個lib中我的內部項目我需要一些關於庫設計的批評

(function() { 
    var window = this, 
     undefined; //guaranteed undefined 

    var h3 = window.h3 = function (user) { return window.h3 = new h3.prototype.init(user); }; 

    h3.prototype = { 
     init: function(user) { 
      this.timestamp = +new Date; 
      this.user = user; 
      return this; 
     }, 
     VERSION: '0.0.1', // Current version. 
     timestamp: undefined, 
     user: undefined, 
     a: function() {alert('a');} 
    }; 

    h3.prototype.init.prototype = h3.prototype; 
})(); 

下面是一個用例: 我需要將存儲會話的用戶數據,並提供應用程序的一些功能,如加載(通過AJAX)的信息,顯示報告等申請一個lib完全由AJAX驅動。在jQuery的幫助下,我將檢查用戶憑據並使用h3({user:'user_a',foo:'bar'})調用來初始化此庫。因此,我將有一個名爲h3的全局對象,並可以使用它後者(如h3.a())。如果我需要重新初始化這個對象,我可以用h3.init({user:'user_b',foo:'bla-bla-bla'})調用。
設計靈感來自着名的jQuery lib。
而主要問題是 - 這有多好/壞?你能幫我驗證這個設計嗎?

+1

好壞不談,有你實現並測試它?它工作嗎? – 2009-11-26 10:09:04

+0

是的,它的工作。但是我沒有在廣泛的環境中測試它。 – NilColor 2009-11-26 10:18:30

回答

2

我完全不知道原型設計是什麼,或者init既是方法又是構造函數,或者是額外的構造函數包裝。最好不要使用太多的JS魔術,如果你能幫助它。

如果,因爲它似乎,你只能有一個全局實例,忘記原型和簡化:

var h3= { 
    VERSION: '0.0.2', 
    init: function(user) { 
     this.user= user; 
     this.timestamp= +new Date; // note, this. missing in original code 
    }, 
    a: function() { 
     alert('a'); 
    } 
}; 
h3.init({user: 'user_a', foo: 'bar'}); 
+0

同意。太糊不好。所有我想要的是在init之前防止h3的使用。你可以在init()調用之前調用'h3.a()'方法。我不想要這個。在init()調用之前的版本中,h3只是一個包裝的初始化函數... 感謝編輯'this.timestamp' - 代碼。 – NilColor 2009-11-26 12:13:38

+0

通常'a()'會用'user'做某些事情,所以如果你調用它,你肯定會得到一個錯誤。但是,如果在這個')'檢查'a'中放入一個'if(!('user')'似乎相對簡單。 – bobince 2009-11-26 14:30:40