Странное поведение Javascript `new` из` function` [дубликат]

Oct 15 2020

Я только что столкнулся с чем-то, что меня действительно удивляет. Рассмотрим следующие четыре функции:

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». Но я в этом не уверен.

Ответы

1 Lorand Oct 16 2020 at 02:51

Когда вы используете оператор 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}
3 Harkal Oct 16 2020 at 02:40

в JavaScript, когда вы вызываете функцию без new, как будто test()она просто запускает функцию и она. возвращает все, что возвращается функцией

а когда вы вызываете функцию с помощью new, как будто new test()она ожидает, что оператор return вернет объект, другой thisобъект return .

так

function test() {
    this.q = 1
}

test(); // return undefined

new test(); // return {q:1}