Преимущества использования литеральной записи объекта в конструкторе объекта? - PullRequest
1 голос
/ 23 июня 2011

Я пытаюсь понять тонкости JS и вижу много примеров объектных литералов, передаваемых в конструкторы. Каковы преимущества этого подхода и как бы я создал свой объект, чтобы использовать этот подход?

Например:

myTooltip = new YAHOO.widget.Tooltip("myTooltip", { 
    context: "myContextEl", 
    text: "You have hovered over myContextEl.",
    showDelay: 500
});

Предположим, я создавал простой класс. Многие простые уроки OO предлагают что-то вроде

myCat = new Cat();
myCat.name = "fluffy";
myCat.friendly = true;
myCat.lives = 9

В отличие от

myCat = new Cat({
    name: "fluffy", 
    friendly:true,
lives: 9
})

Как мне создать объект Cat, чтобы использовать этот подход?

Ответы [ 2 ]

7 голосов
/ 23 июня 2011
function Cat(params) {
 this.name = params['name'];
 this.friendly = !!params['friendly'];
  //etc
}

var tom = new Cat({'name' : 'tom', 'friendly' : 'true'});

Преимущества в том, что вы получаете именованные параметры (если вы получаете их много, вам не нужно запоминать порядок).

Для меня это тожеболее читабельный

new Cat({'name' : 'tom', 'friendly' : 'true', 'lives' : 9});

чем

new Cat('tom',true,9);

Более того, по умолчанию проще указать значения, например, используя underscore.js , например:

function Cat(params) {

  var defaults = {'friendly' : true, 'lives' : 9};

  params = _.extend(params, defaults);

}
0 голосов
/ 23 июня 2011

В вашем первом примере с YUI литерал объекта используется просто как словарь опций. Это полезно в языке, где нет именованных параметров и функция принимает много аргументов. Кроме того, в JavaScript проще играть с настройками по умолчанию.

Возьмите следующий пример:

function myf(options) {
  var url = options['url'] || 'http://...';
  var method = options['method'] || 'get';
  // ...
}

// Now you can pass only what you deem necessary in the function
myf({ 'url' : 'http://stackoverflow.com' });
myf({ 'method' : 'post' });
myf({});

Этот метод используется для практических целей.

...