2010-04-16 4 views
7

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

Заранее благодарен.

+2

была хорошая тема об этом несколько дней назад. http://stackoverflow.com/questions/1595611/how-to-properly-create-a-custom-object-in-javascript – lincolnk

+0

По соглашению рекомендуется, чтобы первая буква функций объекта была заглавной. – Sydwell

ответ

7

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

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

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

Насколько велик массив? Что такое массив? Производительность может быть стоит рассмотреть ...

1

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

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

1

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.

3

Лучший способ для создания JavaScript объектов является бросить курить, используя новый (по крайней мере, если вы подписались на Крокфорд лагеря)

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, я настоятельно рекомендую: -)

+0

Gah! 'new function() {...}' абсолютно неверна! использование функций factory/builder прекрасное и хорошее, но «новая функция ...» очень не правильная. –

+1

@SeanMcMillan говорит, что это неправильно, полезно, только когда вы приводите аргументы :) –

+2

@ GôTô: Ярмарка. 'new function() {...}' будет создавать новый объект, полученный из прототипа анонимной функции, и использовать анонимную функцию для его инициализации. Вы в конечном итоге создаете экземпляр объекта, который вам не нужен. Это честно выглядит как опечатка для меня. В любом случае 'obj.testing' будет объектом, а не функцией, и предупреждение будет выполняться при создании, а не как метод. Игнорирование «новой» анонимной функции полностью избыточно, просто назначив новый объект ('{}'). –