Создание новых объектов в JavaScript

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

function myObjectType(property1, propterty2) {
    this.property1 = property1,
    this.property2 = property2
}
// now create a new instance
var myNewvariable = new myObjectType('value for property1', 'value for property2');

Но я видел другие способы создать новые объекты-экземпляры этим способом:

var anotherVariable = new someObjectType({
    property1:    "Some value for this named property",
    property2:    "This is the value for property 2"
});

Мне нравится, как тот второй путь появляется - код сам документирование. Но мои вопросы:

  1. Какой путь "лучше"?

  2. Я могу использовать тот второй способ инстанцировать переменной типа объекта, который был определен с помощью "классического" способа определить тип объекта с тем неявным конструктором?

  3. Если я хочу создать массив этих объектов, есть ли какие-либо другие соображения?

Заранее спасибо.

7
задан Ken Ray 16 April 2010 в 13:40
поделиться

4 ответа

Это действительно по вкусу. Таким образом:

var anotherVariable = new someObjectType({
    property1:    "Some value for this named property",
    property2:    "This is the value for property 2"
});

... обычно лучше, если аргументов больше 2/3, так как это облегчает читаемость и позволяет избежать проблемы с необязательными аргументами ( fn (null, null, null, 123 ') ).

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

Могу ли я использовать этот второй способ для создания экземпляра переменной объектного типа, который был определен с использованием «классического» способа определения типа объекта с помощью этого неявного конструктора?

Непросто. Если вы хотите создать экземпляр конструктора, используя хэш вместо простой передачи аргументов, и у вас нет контроля над источником, вы можете «обернуть» его:

var _constructor = SomeConstructorFunction;

SomeConstructorFunction = function(hash) {
    return new _constructor(hash.property1, hash.property2);
};

Я бы не рекомендовал возиться со сторонними Хотя API просто ради стиля.

Если я хочу создать массив из этих объектов, нужно ли еще что-нибудь учесть?

Насколько велик массив? Для чего именно нужен массив? Возможно, стоит подумать о производительности ...

7
ответ дан 6 December 2019 в 19:34
поделиться

Лучший способ создавать объекты javascript - это выйти с помощью new (по крайней мере, если вы подписаны на крокфордский лагерь)

myObjectType = function(props) {
  // anything defined on props will be private due to the closure

  props.privateVar = "private";

  // anything defined on obj will be public
  obj = {};

  obj.testing = new function() {
    alert(props.privateVar);
  };

  return obj;
};
instance = myObjectType({prop1: "prop"});

// if we want inheritance, it just means starting with the base type instead of
// a new object
subType = function(props) {
  obj = myObjectType(props);
  obj.subTypeProperty = "hello.";

  return obj;
};

Стр. 52 из Javascript: The Good Parts , я очень рекомендую: -)

3
ответ дан 6 December 2019 в 19:34
поделиться

Что ж, второй способ выглядит неплохо и может быть полезен в случае «класса», у которого есть множество параметров настройки. Однако имейте в виду, что вы фактически создаете другой объект в процессе.

Я бы посоветовал вам прочитать код из того или иного Javascript-фреймворка и найти стиль, который вам понравится.

1
ответ дан 6 December 2019 в 19:34
поделиться

1) Я бы сказал, что метод №2 в любом случае более предпочтителен для меня. Пример с двумя свойствами не сильно отличается, но что, если бы вы захотели это сделать:

var anotherVariable = new someObjectType({
    property1:    "Some value for this named property",
    property2:    "This is the value for property 2"
    //Leaving several properties out, don't want them populated
    property8:    "This is the value for property 8"
    property9:    "This is the value for property 9"

});  

Подумайте, сколько комбинаций перегрузок (или отслеживания null s) вам придется обрабатывать свойства, которые вы можете или не хотите передавать объекту с помощью первого метода. Это гораздо более расширяемый и гибкий подход.

2) Просто разрешите это с пустым конструктором, это будет намного чище для создания экземпляра.

3) Длина / удобочитаемость, особенно с несколькими объектами. Посмотрите на JSON, он довольно чистый / читаемый, опять же, по крайней мере, для меня, если вам нравится этот стиль, создание массивов ваших объектов выглядит очень похожим на метод № 2.

2
ответ дан 6 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: