Когда я читаю это, он говорит мне, что "новый экземпляр заданной цели, созданный путем вызова его (или 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)
Результат выглядит следующим образом:
Это действует так странно для меня, потому что база в документе, когда мы помещаем Child в качестве нового целевого параметра в Reflect.construct, он должен использовать конструктор Child для создания нового экземпляра, но в журнале отображается "This is parent". и свойство Parent сохраняется, в то время как конструктор имеет Child(). Как это возможно? Может кто-нибудь объяснить, что происходит за сценой? Это сводит меня с ума, я действительно хочу знать, как это делает javascript. Большое вам спасибо.
Я бы сказал, что документация несколько ошибочно сформулирована. Похоже, что 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()
чтобы включить эти данные)
new.target
- это специальное ключевое слово, вроде this
; он всегда доступен и ссылается на разные вещи в зависимости от контекста вызова. В частности, это относится к функции, которая в данный момент вызывается как конструктор.
target
(первый аргумент). Он использует newtarget только для получения иерархии наследования.Reflect.construct
может быть использован для десгурации вызововsuper()
в конструкторахclass
.