Ответ 1
Нет, возврат this
не требуется, но он действителен. Если возвращаемое значение является объектом, new
вернет этот объект вместо вновь созданного объекта.
См. пункты 11.2.2 и 13.2.2 ECMAScript 5:
Новый оператор вызывает внутренний конструктор [[Construct]] в конструкторе (обычно это функция):
11.2.2 Новый оператор
Произведение NewExpression: новое NewExpression оценивается следующим образом:
- Пусть ref является результатом оценки NewExpression.
- Пусть конструктор будет GetValue (ref).
- Если тип (конструктор) не является объектом, вызовите исключение TypeError.
- Если конструктор не реализует внутренний метод [[Construct]], создайте исключение TypeError.
- Возвращает результат вызова внутреннего метода [[Construct]] в конструкторе, не предоставляя никаких аргументов (т.е. пустого списка аргументов).
Внутренний метод функций [[Construct]] описан в пункте 13.2.2:
13.2.2 [[Construct]]
Когда внутренний метод [[Construct]] для объекта функции F вызывается с возможным пустым списком аргументов, выполняются следующие шаги:
- Пусть obj - только что созданный собственный объект ECMAScript.
- Задайте все внутренние методы obj, как указано в 8.12.
- Установить внутреннее свойство [[Class]] объекта obj в "Object".
- Установите внутреннее свойство [[Расширяемое]] объекта obj в значение true.
- Пусть proto будет значением вызова внутреннего свойства [[Get]] F с аргументом "prototype".
- Если Type (proto) - Object, установите внутреннее свойство [[Prototype]] для obj для прото.
- Если тип (proto) не является объектом, установите внутреннее свойство [[Prototype]] объекта obj для стандартного встроенного прототипа объекта объект, как описано в 15.2.4.
- Пусть результат будет вызван внутренним свойством [[Call]] для F, предоставив obj как это значение и предоставив список аргументов, переданный в [[Construct]] в качестве аргументов.
- Если тип (результат) - это объект, то возвращает результат.
- Возврат obj.