Создание новых объектов в JavaScript - PullRequest
7 голосов
/ 16 апреля 2010

Я относительно новичок в объектно-ориентированном программировании на 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. Если я хочу создать массив эти объекты, есть ли другие соображения?

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

Ответы [ 4 ]

7 голосов
/ 16 апреля 2010

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

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 только ради стиля.

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

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

3 голосов
/ 16 апреля 2010

Лучший способ создать объекты 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 , я настоятельно рекомендую это: -)

2 голосов
/ 16 апреля 2010

1) Я бы сказал, что метод № 2 в любом случае предпочтительнее для меня. Пример с 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 с) вам придется обрабатывать свойствами, которые вы можете или не хотите предоставлять объекту с помощью первого метода. Это намного более расширяемый и гибкий подход.

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

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

1 голос
/ 16 апреля 2010

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

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

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