В основном, если ваш конструктор возвращает примитивное значение , такое как строка, число, логическое, нулевое или неопределенное значение (или вы не возвращаете ничего, что эквивалентно возвращению undefined
), a вновь созданный объект, который наследует от конструктора prototype
, будет возвращен.
Это объект, к которому у вас есть доступ с ключевым словом this
внутри конструктора при вызове с ключевым словом new
.
Например:
function Test() {
return 5; // returning a primitive
}
var obj = new Test();
obj == 5; // false
obj instanceof Test; // true, it inherits from Test.prototype
Test.prototype.isPrototypeOf(obj); // true
Но если возвращаемое значение является ссылкой на объект, это будет возвращаемое значение, например ::
function Test2() {
this.foo = ""; // the object referred by `this` will be lost...
return {foo: 'bar'};
}
var obj = new Test2();
obj.foo; // "bar"
Если вас интересуют внутренние компоненты оператора new
, вы можете проверить алгоритм внутренней операции [[Construct]]
, которая отвечает за создание нового объекта, наследуемого от прототипа конструктора, и решить, что вернуть:
13.2.2 [[Construct]]
Когда внутренний метод [[Construct]]
для Function
объекта F
вызывается с возможно пустым списком аргументов, предпринимаются следующие шаги:
- Пусть
obj
будет вновь созданным собственным объектом ECMAScript.
- Установите все внутренние методы
obj
, как указано в 8.12.
- Установите для внутреннего свойства
[[Class]]
obj
значение "Object"
.
- Установите для внутреннего свойства
[[Extensible]]
obj
значение true
.
- Пусть proto будет значением вызова внутреннего свойства
[[Get]]
для F
с аргументом "prototype"
.
- Если
Type(proto)
это Object , set the
[[Prototype]] `внутреннее свойство obj to proto.
- Если
Type(proto)
не является объектом, установите внутреннее свойство [[Prototype]]
объекта obj для стандартного встроенного объекта-прототипа объекта, как описано в 15.2.4.
- Пусть result будет результатом вызова внутреннего свойства
[[Call]
] для F, предоставив obj в качестве значения this и предоставив список аргументов, переданный в [[Construct]]
в качестве аргументов.
- Если
Type(result)
- Объект, то вернуть результат.
- Возврат
obj
.