2012-08-03 63 views
3

我有时喜欢这个JavaScript编码差异

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

你为什么要在'prototype'上创建属性/方法_inside_构造函数?在你的第一个例子中,每当你创建一个新的'class1'实例时,'class1.prototype.callme'被覆盖,这是一种低效率的方式。如果你真的使用'(new class1())。callme()'(即,这不是对这个问题的简化),那么整个类的事情就是多余的。 – nnnnnn 2012-08-03 04:20:50

+0

只是一个例子,但我只想要优势和劣势 – 2012-08-03 04:25:48

+1

第一种模式并不是一个好计划 - 它是一种反模式。实例化一个对象只是从其原型中调用一个方法,这对你没有多大帮助,第二种方式总是会更好。如果实际上你实际上对'class1'的单个实例做了某些事情,那么它为第二个例子提供了一个不同的目的,但是当你没有给出更现实的例子时,比较它们是很难的。 – nnnnnn 2012-08-03 04:30:14

回答

2

第一个是构造函数,第二个是对象,所以它们不一样。您可能想在不同的情况下使用一种或其他。无论如何,你通常在构造函数外声明原型,并使用this.property作为公共方法和变量。第二个选项不能作为类重用,除非你使用类似jQuery的extend或Underscore的_extend这是我通常这样做的方式,似乎更简单,没有原型链臃肿的代码。

+0

true我同意,也有一段时间,当你使用fire bug时,第一种方法不会显示代码,但是第二种方法不会影响代码,那么这也算数?纠正我,如果我错了 – 2012-08-03 04:24:27

+0

你能给我一个扩展的例子吗?你的意思是在新类上创建相同的方法(称为类3),当你扩展时,类2的方法将覆盖类3的方法?对不起,如果你困惑你:) – 2012-08-03 04:27:59

1

对于使用Module pattern

的自由,有这只能通过我们的模块消耗私有函数。由于它们没有暴露给页面的其余部分(只有我们导出的API是),它们被认为是真正的私有。

鉴于函数通常被声明并被命名,当我们试图发现哪些函数抛出异常时,在调试器中显示调用堆栈会更容易。

正如T.J Crowder在过去指出的那样,它也使我们能够根据环境返回不同的功能。过去,我已经看到开发人员使用它来执行UA测试,以便在其特定于IE的模块中提供代码路径,但是我们现在可以轻松选择功能检测来实现类似的目标。

+1

虽然这是一个很好的博客文章在一般意义上说,它根本不涉及这个问题。 – nnnnnn 2012-08-03 04:24:21

+0

更新:),谢谢指出 – 2012-08-03 04:56:16