Странное поведение Javascript `new` из` function` [дубликат]
Я только что столкнулся с чем-то, что меня действительно удивляет. Рассмотрим следующие четыре функции:
function A() {
this.q = 1;
}
function B() {
this.q = 1;
return this;
}
function C() {
this.q = 1;
return 42;
}
function D() {
this.q = 1;
return {};
}
и давайте создадим объекты (через new) из всех них:
console.log('a', new A());
console.log('b', new B());
console.log('c', new C());
console.log('d', new D());
Это результат:
a A { q: 1 }
b B { q: 1 }
c C { q: 1 }
d {}
Первые три, похоже, указывают на то, что не имеет значения, что возвращает функция, что JS заботится только о том, что делает каждая функция this(кстати, как я раньше считал). Но последнее противоречит этому.
Итак, что здесь происходит? Мое пересмотренное правило звучит так: «если функция возвращает Object, мы сохраняем это. В противном случае мы сохраняем this». Но я в этом не уверен.
Ответы
Когда вы используете оператор new, он создает объект.
Возвращаемое значение соответствует ожиданиям. Если в возврате это объект, он вернет этот объект, в противном случае, если возврат является функцией, вернет эту функцию.
function A(){
this.b = 3;
return function(){return 4;};
}
function B(){
this.b = 3;
return { d:4};
}
console.log(typeof (new A())); //function
console.log(typeof (new B())); //object {d:4}
Если любое другое значение или отсутствует в возвращении, этот оператор будет иметь приоритет, возвращенный как объект.
function C(){
this.b = 3;
return "78";
}
console.log(typeof (new C())); // object {b:3}
в JavaScript, когда вы вызываете функцию без new, как будто test()она просто запускает функцию и она. возвращает все, что возвращается функцией
а когда вы вызываете функцию с помощью new, как будто new test()она ожидает, что оператор return вернет объект, другой thisобъект return .
так
function test() {
this.q = 1
}
test(); // return undefined
new test(); // return {q:1}