javascript类定义与对象的性能

时间:2015-10-15 11:36:29

标签: javascript performance class prototype

我正在编写一个广泛使用特定形式数据集的javascript应用程序,例如

{ foo: 'foo', bar: 'bar', quz: { baz : 'baz' }}

它只是数据,但是它是嵌套的。没有静态数据。

我想为该数据集创建一个模板以保持代码清洁。我可以将模板对象放在某处并且每次都克隆它,就像(仅使用jquery作为示例)

var ds = jQuery.extend(true, {}, config.dataset);

或者我可以创建一个' Class'或者我可以用

调用的函数原型
var ds = new Dataset();

什么表现最好?如果使用new构造函数,那么Class和函数定义之间是否存在差异?

3 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点,不仅你指定的两个,你也可以使用纯JS原型,当比较所有三个时,似乎纯js将是最快的。

少数事情:

  1. 请注意,使用Classes是ES6,目前尚未得到所有浏览器的广泛支持。
  2. 旧的“new”被称为原型继承,如果你使用它(我建议你这样做,或使用Object.create的新格式),请注意在类之间共享数据成员。
  3. 您也可以使用JSON.parse(JSON.stringify(firstValueObject));
  4. 克隆对象
  5. 如果选择Object.create(ES5),则可以定义默认值:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create
  6. http://jsperf.com/jquery-class-create-vs-pure-js-function/3

答案 1 :(得分:0)

一般情况下,“什么表现最佳?”的答案是:担心如果<何时您确实遇到了性能问题。

“什么表现最好?”的答案在JavaScript中是:

  1. 参见一般答案,

  2. 依赖于测试目标JavaScript引擎(浏览器等)

  3. 让我们忽略表现,看看你给出的替代方案。

    实现DataSet“类”(构造函数和相关原型,使用新的或旧的语法)将非常复杂,并且对于您描述的用例几乎没有任何好处。您有一个嵌套的对象结构:

    { foo: 'foo', bar: 'bar', quz: { baz : 'baz' }}
    

    ...所以如果你把它作为原型,那么非常很容易在实例之间进行串扰。例如:

    // Demonstrating cross-talk
    function DataSet() {
    }
    DataSet.prototype = { foo: 'foo', bar: 'bar', quz: { baz : 'baz' }};
    
    var d1 = new DataSet();
    var d2 = new DataSet();
    d1.quz.baz = "updated";
    document.body.innerHTML = d2.quz.baz; // "updated" - huh?!

    为避免这种情况,您必须在构建时复制quz属性:

    function DataSet() {
        this.quz = jQuery.extend(true, {}, this.quz);
    }
    

    然后,您必须记住在原型中添加新的嵌套对象时这样做。

    根据您所说的,最简单的解决方案就是将您的第一个示例与jQuery.extend一起使用。

答案 2 :(得分:0)

受到TJCrowder在这里的回答的启发,我想出了第三个选项

function newDataset( return { foo: 'foo', bar: 'bar', quz: { baz : 'baz' }});
var ds = newDataset();
  • 它集中了数据集的定义,这是目的
  • 它始终会创建一个新对象,而不存在共享数据的风险 成员
  • 我可以随时改变内部机制
  • 的基准