Я относительно новичок к объектно-ориентированному программированию в 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"
});
Мне нравится, как тот второй путь появляется - код сам документирование. Но мои вопросы:
Какой путь "лучше"?
Я могу использовать тот второй способ инстанцировать переменной типа объекта, который был определен с помощью "классического" способа определить тип объекта с тем неявным конструктором?
Если я хочу создать массив этих объектов, есть ли какие-либо другие соображения?
Заранее спасибо.
Это действительно по вкусу. Таким образом:
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 просто ради стиля.
Если я хочу создать массив из этих объектов, нужно ли еще что-нибудь учесть?
Насколько велик массив? Для чего именно нужен массив? Возможно, стоит подумать о производительности ...
Лучший способ создавать объекты 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 , я очень рекомендую: -)
Что ж, второй способ выглядит неплохо и может быть полезен в случае «класса», у которого есть множество параметров настройки. Однако имейте в виду, что вы фактически создаете другой объект в процессе.
Я бы посоветовал вам прочитать код из того или иного Javascript-фреймворка и найти стиль, который вам понравится.
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.