Уже есть несколько очень хороших ответов, но я выкладываю новый, чтобы подчеркнуть мое наблюдение по случаю III ниже о том, что происходит, когда у вас есть явный оператор возврата в функции, которой вы являетесь new
вверх. Посмотрите на следующие случаи:
Дело I :
var Foo = function(){
this.A = 1;
this.B = 2;
};
console.log(Foo()); //prints undefined
console.log(window.A); //prints 1
Выше приведен простой случай вызова анонимной функции, обозначенной Foo
. Когда вы вызываете эту функцию, она возвращает undefined
. Поскольку явного оператора возврата нет, интерпретатор JavaScript принудительно вставляет оператор return undefined;
в конец функции. Здесь window - объект вызова (контекстный this
), который получает новые свойства A
и B
.
Случай II :
var Foo = function(){
this.A = 1;
this.B = 2;
};
var bar = new Foo();
console.log(bar()); //illegal isn't pointing to a function but an object
console.log(bar.A); //prints 1
Здесь интерпретатор JavaScript, увидев ключевое слово new
, создает новый объект, который действует как объект вызова (контекстуальный this
) анонимной функции, указанной Foo
. В этом случае A
и B
становятся свойствами вновь созданного объекта (вместо объекта окна). Поскольку у вас нет явного оператора return, интерпретатор JavaScript принудительно вставляет оператор return для возврата нового объекта, созданного из-за использования ключевого слова new
.
Дело III :
var Foo = function(){
this.A = 1;
this.B = 2;
return {C:20,D:30};
};
var bar = new Foo();
console.log(bar.C);//prints 20
console.log(bar.A); //prints undefined. bar is not pointing to the object which got created due to new keyword.
Здесь снова интерпретатор JavaScript, увидев ключевое слово new
, создает новый объект, который действует как объект вызова (контекстуальный this
) анонимной функции, указанной Foo
. Снова A
и B
становятся свойствами вновь созданного объекта. Но на этот раз у вас есть явное выражение return, поэтому интерпретатор JavaScript не сделает что-то свое.
В случае III следует отметить, что объект, созданный из-за ключевого слова new
, был потерян с вашего радара. bar
фактически указывает на совершенно другой объект, который не тот, который интерпретатор JavaScript создал из-за ключевого слова new
.
--- Дополнительная информация ---
Функции, используемые в фрагменте кода вышеупомянутых случаев, имеют специальные имена в мире JS, как показано ниже:
Случай I и II - Функция конструктора
Случай III - Заводская функция. Фабричные функции не следует использовать с ключевым словом new
, которое я сделал для объяснения концепции в текущем потоке.
Вы можете прочитать о разнице между ними в этой теме.