【问题标题】:Literal object and function constructor文字对象和函数构造函数
【发布时间】:2011-08-22 18:42:16
【问题描述】:

我在http://jsperf.com/literal-obj-vs-function-obj 上进行了此测试,Literal 在 FF6、Opera 10、IE8 上获胜,但 Function 方法在 Chrome 13.0.782.112 上更快,所以哪一个有更好的使用方法吗?

var A = {
    aa : function(){
        var i, j=[];
        var arr = ['Literal', 'Function'];
        for (i = 0; i < arr.length; i++){
            j[i] = arr[i];
        }
       return j[0];
    }
};
var A1 = A;
var A2 = A1;
A1.foo = ' Test';
alert(A1.aa() + A2.foo);

//Function test
function B(){
    this.bb = function(){
        var i, j=[];
        var arr = ['Literal', 'Function'];
        for (i = 0; i < arr.length; i++){
            j[i] = arr[i];
        }
        return j[1];
    }
}
var B1 = new B();
var B2 = new B();
B.prototype.foo = ' Test';
alert(B1.bb() + B2.foo);

【问题讨论】:

    标签: javascript function object-literal function-prototypes


    【解决方案1】:

    说实话,我发现的最好的是混合:

    function C() {
        var i, j = [],
            foo;
    
        return {
            bb: function() {
    
                var arr = ['Literal', 'Function'];
                for (i = 0; i < arr.length; i++) {
                    j[i] = arr[i];
                }
                return j[1];
            },
            setFoo: function(val) {
                foo = val;
            },
            getFoo: function() {
                return foo;
            }
        }
    }
    var C1 = C();
    var C2 = C();
    C2.setFoo(' Test');
    console.log(C1.bb(), C2.getFoo());
    

    【讨论】:

    • 我在 jsperf 上检查并测试了您的修订,这肯定是一个不错的方法,但我认为文字是一个不错的选择,就像在 Crockford 的 Bonus Suggestions javascript.crockford.com/code.html
    【解决方案2】:

    你喜欢哪一个。速度永远不应成为问题,除非它成为您应用程序中的真正问题。你所做的对我来说看起来像是过早的优化,这是浪费时间。等到你需要优化你的代码,然后再优化需要返工的部分。这是微不足道的。

    【讨论】:

      【解决方案3】:

      Chrome 使用了一种名为 hidden classes 的优化,可以更快地访问对象成员。

      我敢打赌,只有当对象通过new 构造时才启用此优化,因此通过new 构造的对象将比不通过new 构造的对象具有更快的成员访问权限。

      【讨论】:

        【解决方案4】:

        好吧,根据wikipedia,chrome 拥有大约 17% 的市场份额。所以使用文字。

        【讨论】:

          【解决方案5】:

          我怀疑你是否会做任何足够密集的事情来影响差异。

          函数式构造函数为您提供私有变量的选项,这很好。

          【讨论】:

            猜你喜欢
            • 2010-10-08
            • 2017-10-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-20
            • 2021-10-22
            • 1970-01-01
            • 2012-12-22
            相关资源
            最近更新 更多