В первой переменной нотации fooModel
является объектом, созданным без вызова конструктора, во второй записи fooModel
является объект, созданный с вызовом конструктора, как анонимные функции, так при использовании new
функция конструктора ключевых слов вызывается и объект создается из своего прототипа (в этом примере прототип не объявлен, поэтому он является прототипом стандартного объекта).
Заключение
Использование второго обозначения, если Ваш объект должен вызвать некоторый код , когда создается, используйте первый, если нет.
Подробнее о втором нотации
Второе обозначение позволяет также используя локальные (частные) переменные и функции внутри конструктора, поскольку конструктор дает нам собственный объем.
var obj=new function(){
var priv="Local scope variable";
var method=function(){
console.log("Local method");
};
this.doStuff=function(){
//here local methods and variables can be used
};
};
Второе обозначение с конструктором и new
чаще используется при стандартной функции конструктора декларации и декларации прототипа. Это правильный путь, если нам нужно создать более одного объекта. Методы и все общие свойства должны быть объявлены в прототипе не в конструкторе.
var ExampleClass=function(bar){
//constructor
this.bar = bar;
};
ExampleClass.prototype.doStuff=function(){
};
Создание такого объекта:
var a=new ExampleClass("A bar"); //a.bar is "A bar"
var b=new ExampleClass("B bar"); //b.bar is "B bar"
Объекты a
и b
имеют один и тот же прототип (это экономит память), но они могут иметь различные свойства, установленные в конструкторе.
оффтоп
В JavaScript так много возможностей для создания объектов, у меня есть третий пример того, как запустить код в первой записи:
window.fooModule = {
init: function() {
this.bar = "cee";
this.doStuff();
return this;//return this
},
doStuff: function() {
}
}.init();//run init after object notation
я создаю объект и запустить инициализации в одно время.
Второй [не совсем ужасно] (http://stackoverflow.com/q/10406552/1048572) и никогда не должны использоваться – Bergi
О, это глупо, сняли флаг, продолжайте! – Roberrrt
Разница заключается в том, что 'doStuff()' в первом случае завершится с ошибкой имени. – deceze