2013-10-04 3 views
1

В моей последней javascript-программе (которая в основном предназначена для удовольствия и доказательств концепции, чем что-либо еще), у меня есть много разных объектов, и у каждого вида у меня будет достаточно количество «экземпляров». Так я думал, что я должен использовать классы для них, однако, так как они очень просты, я мог бы просто построить их непосредственно, вместо использования классов ...Javascript классы против объектов, за и против?

Пример того, что я имею в виду:

//I'm making a "car" object that has the properties model, miles, value and color 
//using a class like: 
function car (model, miles, value, color) { .... } 
//so I'd create a new car by using: 
mycar = new car(model, miles, value, color); 

//However for an object so simple I could also do: 
mycar = {model: model, miles: miles, value: value, color: color}; 

Я угадание последнего метода было бы более эффективным в некотором роде (без вызова функции класса), но стоит ли это?

Чтобы решить, что я хотел бы знать о плюсах и минусах использования классов против обычных объектов. Например, классы занимают значительно больше памяти, например?

+3

использовать конструкторы, когда вам нужно наследовать прототипы. используйте литералы, когда вам просто нужен набор значений для задачи. – dandavis

+1

Это дело до ООП и процедурного программирования. – webduvet

+1

Я бы рекомендовал всегда поддерживать читаемость и ремонтопригодность. Если он очищает ваш код, чтобы иметь класс, пойдите для него. У вас есть дополнительная функция в памяти для ее определения и дополнительный вызов функции для ее вызова. Если обстоятельства не являются экстремальными, затраты незначительны. –

ответ

2

С точки зрения производительности разница возникает при добавлении методов. При использовании литералов объектов каждый объект должен иметь поле для каждого метода:

obj1--> { x: 10, 
      f1: method1, 
      f2: method2 } 

obj2--> { x: 17, 
      f1: method1, 
      f2: method2 } 

С классами, вы можете поделиться общими свойствами за общим прототипом:

obj1--> { x:10, 
      __proto__: --------> { f1: method1, 
     }    /----> f2: method2 } 
         | 
obj2--> { x:17,   | 
      __proto__: ---/ 
     } 

Тем не менее, разница в производительности являются только будет иметь значение, если вы создаете объект объектов, и эти объекты имеют множество методов, и многие из этих методов являются закрытием. Если бы я был вами, я бы уделял больше внимания проблемам стиля кода: например, с помощью метода литерала объекта вы можете использовать блокировки для имитации частных переменных, а если методы находятся в общем общедоступном прототипе, то все ваши переменные экземпляра должны быть общедоступными ,

+0

В конструкторе могут быть добавлены и частные переменные. –

+0

Спасибо, я думаю, что я использую литерал для большинства моих объектов, за исключением нескольких более крупных, которые должны иметь свои собственные функции. – Wingblade

1

Прежде всего, there are no classes в JavaScript. Так в чем разница?

  • Объект, созданный конструктором, имеет объект-прототип, из которого он наследует свойства. Этот объект-прототип разделяют все объекты, построенные с помощью одной и той же функции. Вы можете использовать там общие методы, которые будут considerably faster.
  • Вызывается функция-конструктор. Вы можете использовать его для инициализации своего объекта (заполнить значения по умолчанию, проверить параметры и т. Д.), И у вас есть возможность для создания закрытий.

Даже если для некоторых объектов вам не нужны прототипы, функция, возвращающая простые объекты для вас, по-прежнему имеет преимущества. По крайней мере, он предоставляет вам гибкость для изменения реализации без необходимости изменения каждого экземпляра в вашей кодовой базе. Поэтому, начните с простого

function Car (model, miles, value, color) { 
    return {model: model, miles: miles, value: value, color: color}; 
} 

(который можно даже назвать с new без эффектов) и продлить его позже, если вам нужно.

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