@Alex_At_Net
https://alexatnet.com/mentoring

JavaScript: объясните return в конструкторе

Объясните, пожалуйста, в чем разница между кодом:

var Test = (function () {
return (function () {
this.qqq = 'a';
});
})();

alert(new Test().qqq);


и

var Test = (function () {
return (function () {
return ({ qqq : 'a' });
});
})();
alert(new Test().qqq);


В обоих вариантах выводится «а». Почему в первом случае — понятно. Первая функция создает замыкание, в которое можно поместить «статические» переменные. Вторая — собственно конструктор и в конструкторе задается объект. Но почему во втором?

Спасибо.
  • Вопрос задан
  • 4449 просмотров
Пригласить эксперта
Ответы на вопрос 2
apangin
@apangin
Для простоты понимания примеры можно сократить до следующих.
Первый: function Test() { this.qqq = a; }
Второй: function Test() { return {qqq: 'a'}; }

Теперь обратимся к спецификации ECMA-262, пункт 13.2.2. [[Construct]]

When the [[Construct]] property for a Function object F is called, the following steps are taken:
1. Create a new native ECMAscript object.
2. Set the [[Class]] property of Result(1) to «Object».
3. Get the value of the prototype property of the F.
4. If Result(3) is an object, set the [[Prototype]] property of Result(1) to Result(3).
5. If Result(3) is not an object, set the [[Prototype]] property of Result(1) to the original Object prototype object as described in 15.2.3.1.
6. Invoke the [[Call]] property of F, providing Result(1) as the this value and providing the argument list passed into [[Construct]] as the argument values.
7. If Type(Result(6)) is Object then return Result(6).
8. Return Result(1).

Разгадка кроется в двух последних строках: если функция возвращает объект, то результатом работы конструктора считается этот объект, если же функция возвращает что-либо другое (либо ничего не возвращает), результатом работы конструктора считается новый объект, созданный на шаге 1.
Ответ написан
ojiga
@ojiga
что за индуиский код? откуда мне знать что именно вам не понятно?

во втором примере используется json
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы