js jquery原型函数与嵌套函数

时间:2013-10-07 06:03:18

标签: javascript jquery

我试图理解Prototype函数和嵌套函数之间的区别。 我需要知道以下

  1. 哪个更好,性能更好
  2. 两者之间的主要区别是什么
  3. 哪种结构更适合哪种情况(我假设两者都有不同的目标)?
  4. 我的基本用法: 我的基本用法是我想为web应用程序编写一个主要功能,在启动时,它会在应用程序导航期间创建菜单,按钮,按钮点击事件,绘制图表,制作表格等,我需要将代码更好地构建和最快的方式。我将使用jquery及其插件 *

    为了简化使用,请考虑我需要在may app中的许多地方/阶段创建portlet / widget容器,我只需要调用var port = App.creatPortlet()然后调用port.content(// place data)

    请帮助。

    性能: 我在这里创建了性能测试prototype-vs-nested-function,似乎 PROTOTYPE函数 更快。但我需要一些建议。

    原型功能:

      function Person(opt) {
        this.firstName = opt.firstName;
        this.lastName = opt.lastName;
      }
    
      Person.prototype.getFullName = function() {
        return this.firstName + " " + this.lastName;
      };
     // Testing performance
     var P1 = new Person({
       firstName: 'Jeremy',
       lastName: 'McPeak'
     }).getFullName();
    

    NESTED FUNCTION:

    var Person = function(opt) {
       return {
         getFullName: function() {
           return opt.firstName + " " + opt.lastName;
         }
       };
     }
     // Testing performance
     var P1 = new Person({
       firstName: 'Jeremy',
       lastName: 'McPeak'
     }).getFullName();
    

    更新 http://jsperf.com/closure-prototype-static-reveal 我根据自己的确切需要创建了benchamrk。

1 个答案:

答案 0 :(得分:3)

首先,针对如此小部分代码的性能测试并不是很有用,因为您不知道这是否会反映实际用例场景中的性能。 (可能会发生这种小代码测试JS引擎的优化器,例如内联某些方法或触发JS引擎的优化过程,这需要更长的时间来初始化,但会在实时应用程序中带来性能提升,你发现了测试库的缺陷,....)

我打赌你不要在这里测试原型 vs 嵌套函数,但两个作业 vs 范围处理

看看你的测试,你甚至都不测试这两种情况。您只需测试案例二(在准备中,您使用Person覆盖对名称函数var Person = ...;的访问权限,因此您的测试中从不使用function Person。它应该如下所示:updated jsperf.com
编辑看起来你在我写作的时候已经改变了自己。)

无论如何,有什么不同,有什么更好。两者都有有效的用例,由你决定什么是更好的。

对象类型

对于第一个,Person创建的每个对象都是相同的类型:

 var p1 = new Person();
 var p2 = new Person();

 console.log( p1 instanceof Person);  //true
 console.log( p2 instanceof Person);  //true

在第二个示例中,您创建的每个对象都是Object类型 因此,如果对象是第一个传递给另一个函数,则可以测试它是否为Person类型,而对于第二个函数,则可以测试。

虽然我更喜欢测试功能/功能的存在而不是测试类型,但这对我来说没有区别。

原型链

有时更新/扩展所有对象的功能或修改/扩展一种类型的所有对象的现有函数是有用的。
虽然这对于第一个例子是可能的,但是第二个例子是不可能的。

var Person = function() {
};

var p1 = new Person();
Person.prototype.doSomething = function() {console.log("....");};

p1.doSomething();

重复使用代码

使用第一个示例,您可以在与给定对象类似的对象上重用您的函数。你可以这样做:

Person.prototype.doSomething.call(similarOBject, ...);

在某些情况下这可能很方便。通常使用的示例是数组上的Array函数,例如对象。

保护原始数据

有时保护某些 raw 数据不被直接读取/修改是有用的。 那就是第二个例子的力量。虽然我个人认为这应该由一个好的文档处理,而不是通过代码强制它,它仍然是一个有效的用例。 在您的示例中,firstNamelastName在外部完全隐藏,但创建Person的代码部分除外。

效果和速度

哪一个在速度和内存使用方面表现更好,主要取决于JS引擎。 并非每个引擎都会为嵌套函数创建一个新函数,它更有可能被正确检测到,并且只是在第二次调用时引用。范围创建会有一些开销,但这可能是微不足道的,具体取决于对象数量以及创建它们的频率。

但正如已经说过的,你很可能会在你的代码中有其他东西会造成瓶颈。

在大多数情况下,使用prototype是更好的选择,具有可维护性和可读性。