2009-11-26 48 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