2012-06-04 2 views
1

Насколько я понимаю, рекомендуется использовать версию 2 (см. Ниже), используя прототип. Однако в чем разница между этими двумя версиями, поскольку не только версия 1 иногда превосходит версию 2 в потреблении памяти, она также регулярно завершается с половиной до трети времени (согласно моим тестам с использованием Chrome).Какое создание объекта javascript более эффективно?

Версия 1:

var C = function() { console.log("new C"); } 

    C.f = function(foo) { console.log("function"); } 

    var a = []; 
    for (var i = 0; i < 100000; i++) { 
     a.push(new C()); 
    } 

Версия 2:

var C = function() { console.log("new C"); } 

    C.prototype.f = function(foo) { console.log("function"); } 

    var a = []; 
    for (var i = 0; i < 100000; i++) { 
     a.push(new C()); 
    } 
+1

Возможный дубликат [Закрытие в функциях автоматического выполнения по сравнению с объектами] (http://stackoverflow.com/questions/8231730/closures-in-auto-executing-functions-vs-objects) – Neal

+0

Вы «расширяете» объект ? Или просто создать объект, который будет использоваться? – mawcsco

+4

Ваши сценарии не эквивалентны. В первом случае 'f' является свойством конструкторской функции' C', это означает, что экземпляры, созданные с помощью 'new C()' **, не имеют ссылки на 'f'. Во втором случае вы назначаете 'f'' прототипу 'C', из которого наследуются все экземпляры. Вы сравниваете яблоки с апельсинами. Это не должно влиять на производительность, хотя ... вот тестовый файл jsPerf: http://jsperf.com/static-vs-prototype –

ответ

1

версия 1 даст функцию только вашего объекта, в то время как версия 2 будет обеспечивать функцию для всех объектов из функция, содержащая прототип.

И на самом деле я очень любопытно увидеть, если любой из ваших new C(); instanciations в версии 1 имеет доступ к методу C.f ...

+0

Теоретически да, через' instance.constructor.f' (мой комментарий был фактически недостаточно точным), но я не думаю, что это желаемый путь;) –

0

Любая разница в производительности является спорным, так как первая версия не работает.

Добавление функции в качестве свойства функции-конструктора не делает ее методом в созданном объекте.

0

Чтобы проверить язык JavaScript из браузера, вы можете использовать мой инструмент Script Scraper.

enter image description here

спасибо, Martin.

Смежные вопросы