我有时会像这样创建类
function class1(){
.....
class1.prototype.callme = function(){
alert("hai");
}
}
then I instantiate using (new class1()).callme();
有时我使用模块化模式
var class2 = (function(){
var privatemethod = function(){
....
}
var publicmethod = function(){
alert("am public");
}
return{
callme:publicmethod
}
})();
then I call class2.callme()
优势和劣势是什么,有些人可以解释一下。
答案 0 :(得分:2)
第一个是构造函数,第二个是对象,所以它们不一样。您可能希望在不同情况下使用其中一个或其他。在任何情况下,您通常都会在构造函数之外声明原型,并使用this.property
作为公共方法和变量。第二个选项不能作为一个类重用,除非你使用像jQuery的extend
或Underscore的_extend
这样的东西,这是我通常的方式,没有原型链膨胀代码似乎更简单。
答案 1 :(得分:2)
如果你想了解不同的Javascript模式,我肯定会推荐Learning JavaScript Design Patterns它的免费/开源并不断更新。
答案 2 :(得分:1)
拥有私人功能的自由,这些功能只能由我们的模块使用。因为它们没有暴露给页面的其余部分(只有我们导出的API),所以它们被认为是真正的私有。
鉴于函数被正常声明并且被命名,当我们试图发现什么函数引发异常时,在调试器中显示调用堆栈会更容易。
正如T.J Crowder过去指出的那样,它也使我们能够根据环境返回不同的功能。在过去,我见过开发人员使用它来执行UA测试,以便在他们的模块中提供特定于IE的代码路径,但是我们现在可以轻松选择功能检测来实现类似的目标。