Что делает javascript Reflect.construct newTarget

1

Когда я читаю это, он говорит мне, что "новый экземпляр заданной цели, созданный путем вызова его (или newTarget, если присутствует) как конструктор с заданными аргументами". Но на самом деле это совсем не так. Вот пример:

function Parent() {
  this.parent = "Parent"
  console.log("This is parent.")
}
function Child() {
  this.child = "Child"
  console.log("This is child.")
}
var result = Reflect.construct(Parent, [], Child);
console.log(result)

Результат выглядит следующим образом:

Изображение 174551

Это действует так странно для меня, потому что база в документе, когда мы помещаем Child в качестве нового целевого параметра в Reflect.construct, он должен использовать конструктор Child для создания нового экземпляра, но в журнале отображается "This is parent". и свойство Parent сохраняется, в то время как конструктор имеет Child(). Как это возможно? Может кто-нибудь объяснить, что происходит за сценой? Это сводит меня с ума, я действительно хочу знать, как это делает javascript. Большое вам спасибо.

  • 0
    « он должен использовать конструктор Child, чтобы создать новый экземпляр » - нет, он только вызывает конструктор, который вы передаете в качестве target (первый аргумент). Он использует newtarget только для получения иерархии наследования. Reflect.construct может быть использован для десгурации вызовов super() в конструкторах class .
  • 0
    Привет, Берги, я видел твой ответ на этой странице, но извините меня за то, что я новичок в javascript, так что я не до конца понимаю все это. Как и свойство [[NewTarget]] (означает, что двойные скобки означают, что это внутреннее свойство / метод? Но я вижу только свойства типа proto ?), Его нельзя найти в выходном графе, это меня смущает. Итак, основываясь на том, что вы сказали, [[NewTarget]] содержит дочерний конструктор и в конечном итоге делает прото- точку на прототип child () правильно? По крайней мере, это то, что я получаю при включении выходного графика. Пожалуйста, поправьте меня, если я ошибаюсь.
Показать ещё 2 комментария
Теги:

1 ответ

0
Лучший ответ

Я бы сказал, что документация несколько ошибочно сформулирована. Похоже, что construct() вызывает первый первый аргумент как конструктор (т.е. Инициализирует объект), но использует последний аргумент в качестве прототипа (то есть фактический "класс" объекта). В вашем случае result instanceof Child возвращает true, но result instanceof Parent возвращает false.

Таким образом, результат Reflect.construct(target, args, newTarget), по-видимому, эквивалентен этому:

var result = Object.create(newTarget.prototype);
target.apply(result, args);

Тем не менее, существует одно существенное различие: в приведенном выше примере оператор new.target внутри любой функции будет возвращать undefined, так как вы не используете new ключевое слово для создания объекта. Если вы используете Reflect.construct(), с другой стороны, new.target укажет на newTarget (отсюда и название, я полагаю) - вероятно, потому, что в конечном итоге результирующий объект будет принадлежать этому классу.

(Примечание: с тех пор я попросил изменить страницу MDN о Reflect.construct() чтобы включить эти данные)

  • 0
    Привет Мате Сафранка, ваш ответ фантастический. Больше всего меня смутило, когда я увидел выходные данные структуры данных, потому что я не смог найти там свойство new.target. Это какое-то скрытое свойство в функции?
  • 0
    Нет, new.target - это специальное ключевое слово, вроде this ; он всегда доступен и ссылается на разные вещи в зависимости от контекста вызова. В частности, это относится к функции, которая в данный момент вызывается как конструктор.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню