2013-04-27 173 views
1
var Foobar = function() {}; 

Foobar.prototype.clickDetails = function() { 
    $("#foobar").html("test"); 
} 

and 

var Foobar = function() { 
     return { 
      clickDetails: function() { 
       $("#foobar").html("test"); 
      } 
     }; 
}(); 

我想知道,因为后者是存在的,但我无法得到它与茉莉花一起工作,我写了第一个从头开始。两者有什么区别?这两种定义类/对象的方式有什么区别?

+4

你的问题基本上与jQuery无关。这是一个关于JavaScript的问题。我已经添加了相关的标签。 – 2013-04-27 22:16:15

+0

一个需要'new',另一个不需要。一个为每个对象创建不同的功能,一个在原型对象上存储一个。哎呀,我错过了:一个是单身人士,另一个是建设者。 – Bergi 2013-04-27 22:18:46

+0

当您在10秒前发布评论时,您如何在评论中拥有+1? Aussming需要5秒钟的时间来读取它,另外3秒钟来确定它是否值+1并实际添加它,它留下了2秒的时间间隔以供某人找到它,这似乎不太可能。你会提高你自己的意见吗? :/ – Virus721 2013-04-27 22:19:12

回答

5

因为你有()在你的第二个例子结束(谢谢你,BERGI!),您执行的是第二个函数立即存储结果Foobar。因此,第一个示例创建了一个函数,该函数可以通过new(可以重复使用clickDetails的单个副本)创建对象,第二个示例创建一个非函数对象。

如果没有()在你的第二个示例的末尾,如:

var Foobar = function() { 
     return { 
      clickDetails: function() { 
       $("#foobar").html("test"); 
      } 
     }; 
}; // <== No() here 

...那么就会有两个不同点:

  1. 在你第一个示例中,只有一个clickDetails功能,该功能由通过new Foobar()(通过原型链)创建的所有对象共享。在第二个示例中,每次调用Foobar()时都会创建一个新的clickDetails函数。

  2. 在第一个示例中,您通过var obj = new Foobar();(您使用关键字new)创建对象。在你的第二个,只是var obj = Foobar();(虽然你可以使用new关键字,它没有任何有用的影响,是误导)。

+2

我一开始也认为,但实际上第二个是(变相)IEFE。 – Bergi 2013-04-27 22:21:09

+0

这是误导性的,因为1st返回一个继承Foobar原型的对象,而2nd只返回一个带有函数的对象。 – numbers1311407 2013-04-27 22:21:15

+0

@Bergi:是的,谢谢,我看到你对这个问题的评论,并说“但它不是一个单身人士”,直到我意识到......这是。 :-)(我想我已经设法在删除它之前让自己看起来像一个普通的普拉特。) – 2013-04-27 22:23:12

相关问题