Инициализируйте this.variable_name в функции javascript

#javascript

#javascript

Вопрос:

У меня есть функция JavaScript с именем foo. x — это глобальная переменная, которую мы увеличиваем в этой функции. затем я помещаю this.x = x и возвращаю функцию. затем я определил переменную bar = new new foo() . после выполнения этого кода значение bar.x не определено. но почему?

 var x=0;
function foo(){
  x  ;
  this.x = x;
  return foo;
}
var bar = new new new foo;
console.log(bar.x);
 

Комментарии:

1. Отложив в сторону, что вы возвращаетесь foo из конструктора вместо this и забываете () при вызове конструктора (т.Е. new foo Вместо new foo() ): Как вы думаете, с new new new foo() чем бы вы справились (т.Е. 3 раза new )

2. @derpirscher добавление () при использовании new оператора в конструкторе не обязательно.

3. Мне любопытно, каков распространенный вариант использования new new new foo? Тогда каким будет ожидаемое значение new new new new new new new new foo ? Какова цель этого вопроса? И это не ваша функция, та же функция была объяснена в другом месте.

Ответ №1:

Поведение вашего кода является прямым результатом природы конструкторов JS и new оператора. Кроме того, он ведет себя так, как ожидалось. Однако я предполагаю, что ваш вопрос носит чисто теоретический характер, потому что я действительно не вижу подходящего варианта использования для объединения нескольких new операторов в цепочку.

В вашем коде foo есть конструктор, и его единственная цель — указать тип экземпляра, который должен быть создан. Другими словами, его форма / структура.

Когда вы используете new оператор в конструкторе, он создает простой пустой объект и связывает с ним функцию конструктора ( instance.constructor ) , затем он присваивает этот вновь созданный объект this контексту функции и запускает его.

Если функция возвращает объект, то new возвращает и этот объект! Если нет, то new автоматически возвращает этот первый созданный объект ( this ).

В вашем случае вы возвращаете ссылку на свой собственный конструктор. Это объект. Итак, new foo; всегда возвращается конструктор. Вот почему вам разрешено связывать несколько new операторов, что невозможно при использовании стандартного конструктора.

Чтобы получить значение x , вы должны вернуть this значение внутри своего конструктора или вообще не возвращать объект.

Надеюсь, это прояснит внутреннюю механику этого.

О! И, несмотря на общие знания, использование () при использовании new operator не обязательно.

Наконец, чтобы замкнуть кольцо, пожалуйста, посмотрите Следующий фрагмент, используя ваш код:

 let x = 0;

function Foo(c){
  x  ;
  
  this.x = x;
  
  return c ? this : Foo;
}

new new new new new new new new new Foo;

const bar = new Foo(1);

console.log(bar.x); // EXPECTED TO PRINT 10. 

Комментарии:

1. Хотя использование () с конструктором без параметров может быть необязательным, это определенно хороший стиль, и большинство линтеров по умолчанию выдают предупреждение, когда вы их пропускаете.

2. @derpirscher я всегда использую () , но я думаю, что весь смысл этого вопроса заключался в том, чтобы раздвинуть границы конструкторов JS.