Javascript накладные расходы, связанные с классом против объекта - PullRequest
1 голос
/ 13 июля 2011

Мне было интересно, были ли накладные расходы, связанные с созданием нового класса вместо нового объекта этого класса, малыми или большими. Я использую Dojo, но я приведу примеры для чистого JS. Один раз при запуске я буду создавать от 10 до 100 объектов, я не думаю, что это будет серьезной проблемой, но я хочу охватить все свои базы.

Случай 1: объект Javascript

function Person(name){
  this.name = name;
}
var p1 = new Person('Caine');
var p2 = new Person('Seth');
var p3 = new Person('Abel');

В сравнении с делом 2: классы JavaScript

function Person1(){
  this.name = 'Caine';
}

function Person2(){
  this.name = 'Seth';
}

function Person3(){
  this.name = 'Abel';
}
var p1 = new Person1();
var p2 = new Person2();
var p3 = new Person3();

РЕДАКТИРОВАТЬ : люди хотят знать, почему я бы выбрал такой подход. Я реализую модульную программу, в которой пользователь создает и / или загружает объекты по своему усмотрению, вместо того, чтобы иметь один класс Person / Shape / Text ... и вызываю его с 50 000 000 аргументов (имя, возраст, пол, метка, шрифт, х, у, ш, ч ...) Я хочу создать один класс со всеми значениями. Это также упростит редактирование кода, поскольку я хочу, чтобы пользователь мог просматривать и изменять код из браузера. Я не новичок в ООП, и я понимаю, что это отступление от стандартной процедуры программирования, поэтому немного верю в то, что я знаю, что делаю =)

Ответы [ 2 ]

5 голосов
/ 13 июля 2011

Не совсем классы как таковые (у JS их нет), но во втором примере у вас есть две дополнительные функции конструктора.Каждый из них обязательно будет иметь собственный дополнительный объект prototype.

Таким образом, ваш второй подход несколько менее эффективен с точки зрения создаваемых и сохраняемых объектов.Однако, если у вас было много экземпляров Person1, второй подход мог бы сэкономить (небольшое количество) пространство, поместив общее свойство в прототип, а не отдельно в каждом новом экземпляре:

function Person1() {}
Person1.prototype.name= 'Caine';

сохранение одного экземпляра String для каждого экземпляра Person1.

На самом деле это не будет иметь практического значения, и вы должны написать, какое бы ни было чистое выражение идеи, которую инкапсулирует ваш код.(Лично я думаю, что было бы необычно иметь разные классы для каждого имени ...)

1 голос
/ 13 июля 2011

Я написал тестовый пример jsperf, http://jsperf.com/class-vs-object-perf,, чтобы продемонстрировать 4 подхода, 2 с использованием написанных вами случаев, 1 с использованием функции, которая возвращает объект и может быть адаптирована к шаблону модуля, и последнее использование прототип.

В Chrome 14 разница в производительности между 1, 2, 4 практически одинакова. Единственный, который работает медленно, это тот, который похож на шаблон модуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...