【问题标题】:Define constructor prototype with object literal用对象字面量定义构造函数原型
【发布时间】:2011-01-31 06:33:35
【问题描述】:

以下哪种方法最适合定义构造函数原型?为什么?

方法一:

MyConstructor.prototype.myFunction1 = function(){};
MyConstructor.prototype.myFunction2 = function(){};

方法二:

MyConstructor.prototype = {
    myFunction1: function(){},
    myFunction2: function(){}
};

我最关心的是速度。谢谢!

【问题讨论】:

    标签: javascript object prototype constructor object-literal


    【解决方案1】:

    我会说不会有太大的不同。使用对象字面量分配给 Object.prototype 是您无法在构造函数分配原型时做的事情(这有时很有用)。

    也许您应该使用jsperf.com 编写一个小性能测试。

    【讨论】:

    • 有趣。我不知道这存在。我什至一直在寻找这样的工具..虽然不是很困难。谢谢,我会对其进行测试并报告我的发现。
    【解决方案2】:
    var example = new MyConstructor();
    

    方法一下:

    example.constructor === MyConstructor;
    

    方法二下:

    typeof(example.constructor) === 'undefined';
    

    函数附带的原型对象有一个属性constructor,它指向函数。如果您分配给该对象的属性,则保留 constructor 属性。如果用新对象覆盖 prototype 属性,则会丢失 constructor 属性。

    性能差异很小。因为constructor太脆弱了,你不能真正信任它,所以我懒得去保存它。

    【讨论】:

      【解决方案3】:

      您应该使用方法1。使用方法 2,每次创建 new 实例时,您都会“重新创建”这些方法,因为它们在构造函数中。

      【讨论】:

        【解决方案4】:

        进一步谈谈代码的可读性,

        方法一比方法二好。

        方法 2 多使用一个缩进。导致代码阅读困难。

        另外,就我而言, 当我们看到代码下部的函数名称部分时,我无法推断这个函数是原型方法还是只是静态成员函数。

        就个人而言,总而言之, 如果性能差异不大,我更喜欢方法 2。

        谢谢!

        【讨论】:

          最近更新 更多