Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript编码差异_Javascript_Oop_Class - Fatal编程技术网

JavaScript编码差异

JavaScript编码差异,javascript,oop,class,Javascript,Oop,Class,我有时创建这样的类 function class1(){ ..... class1.prototype.callme = function(){ alert("hai"); } } then I instantiate using (new class1()).callme(); 有时我使用模块模式 var class2 = (function(){ var privatemethod = function(){ .... } var publicmethod = fu

我有时创建这样的类

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()

有什么优点和缺点,请一些人解释一下。

第一个是构造函数,第二个是对象,所以它们不一样。您可能希望在不同的情况下使用其中一种。在任何情况下,您通常在构造函数之外声明原型,并对公共方法和变量使用
this.property
。第二个选项不能作为类重用,除非您使用jQuery的
extend
或下划线的
\u extend
,这是我通常使用的方法,如果你想了解不同的Javascript模式,我肯定会推荐它的免费/开源并不断更新

用于:

拥有只能由我们的模块使用的私有函数的自由。由于它们不向页面的其余部分公开(只有我们导出的API公开),因此它们被认为是真正私有的

假设函数是正常声明的,并且是命名的,那么当我们试图发现哪个函数抛出了异常时,在调试器中显示调用堆栈就更容易了

正如T.J Crowder在过去指出的那样,它还使我们能够根据环境返回不同的函数。在过去,我见过开发人员使用它来执行UA测试,以便在他们的模块中提供特定于IE的代码路径,但是现在我们可以很容易地选择特性检测来实现类似的目标


为什么要在构造函数中的
prototype
上创建属性/方法?在第一个示例中,每次创建新的
class1
实例时,
class1.prototype.callme
都会被覆盖,这有点低效。如果你真的使用
(new class1()).callme()
(也就是说,这不是这个问题的简化),整个类的事情是有点多余的。这只是一个例子,但我只想知道它的优点和缺点。如图所示的第一种模式从来都不是一个好的计划——它是一种反模式。实例化一个对象只是为了从其原型中调用一个方法并没有多大帮助,第二种模式总是更好。如果在现实中你真的对
class1
的单个实例做了一些事情,那么这与第二个例子的目的不同,但是如果你不给出一个更现实的例子,就很难比较这两个例子。虽然从一般意义上讲这是一篇很好的博客文章,但它与这个问题根本没有关系。是的,我同意,还有一些时候,当你使用firebug时,第一种方法不会显示代码,但是第二种方法会显示代码,这也算吗?如果我错了,请纠正我你能给我举个例子吗?您的意思是在新类上创建相同的方法(称之为class3)并且当您扩展时,class2的方法将覆盖class3的方法吗?对不起,我把你弄糊涂了:)