Baseline Widely available
СÑаÑиÑеÑкий меÑод Reflect.construct()
ÑабоÑÐ°ÐµÑ ÐºÐ°Ðº new
operator. Ðн ÑквиваленÑен new target(...args)
. ÐÑо Ñакже даÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑказаÑÑ Ð´ÑÑгой пÑоÑоÑип.
function func1(a, b, c) {
this.sum = a + b + c;
}
const args = [1, 2, 3];
const object1 = new func1(...args);
const object2 = Reflect.construct(func1, args);
console.log(object2.sum);
// Expected output: 6
console.log(object1.sum);
// Expected output: 6
СинÑакÑиÑ
Reflect.construct(target, argumentsList[, newTarget])ÐаÑамеÑÑÑ
target
Ð¦ÐµÐ»ÐµÐ²Ð°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð²Ñзова.
argumentsList
ÐаÑÑивоподобнÑй обÑÐµÐºÑ ÑказÑваÑÑий аÑгÑменÑÑ, Ñ ÐºÐ¾ÑоÑÑми target
должна вÑзÑваÑÑÑÑ.
newTarget
ÐеобÑзаÑелÑнÑй
ÐонÑÑÑÑкÑоÑ, Ñей пÑоÑоÑип должен бÑÑÑ Ð¸ÑполÑзован. СмоÑÑиÑе Ñакже new.target
опеÑаÑоÑ. ÐÑли newTarget
не Ñказан, Ñо иÑполÑзÑеÑÑÑ target
.
ÐовÑй ÑкземплÑÑ target
(или newTarget
, еÑли Ñказан), иниÑиализиÑÑеÑÑÑ target
как конÑÑÑÑкÑÐ¾Ñ Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñми аÑгÑменÑами.
ÐÑклÑÑение TypeError
, еÑли target
или newTarget
не ÑвлÑÑÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑами.
Reflect.construct()
позволÑÐµÑ Ð²Ð°Ð¼ вÑзÑваÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¾Ñ Ñ Ð»ÑбÑм ÑиÑлом аÑгÑменÑов (ÑÑо Ñакже возможно Ñ Ð¸ÑполÑзованием spread syntax вмеÑÑе Ñ new
operator).
var obj = new Foo(...args);
var obj = Reflect.construct(Foo, args);
Reflect.construct()
пÑоÑив Object.create()
Ðо поÑÐ²Ð»ÐµÐ½Ð¸Ñ Reflect
, обÑекÑÑ Ð¼Ð¾Ð³Ð»Ð¸ бÑÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ñ Ñ Ð¸ÑполÑзованием пÑоизволÑной комбинаÑии из конÑÑÑÑкÑоÑа и пÑоÑоÑипа пÑи помоÑи Object.create()
.
function OneClass() {
this.name = "one";
}
function OtherClass() {
this.name = "other";
}
// ÐаннÑй вÑзов:
var obj1 = Reflect.construct(OneClass, args, OtherClass);
// ...бÑÐ´ÐµÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñен данномÑ:
var obj2 = Object.create(OtherClass.prototype);
OneClass.apply(obj2, args);
console.log(obj1.name); // 'one'
console.log(obj2.name); // 'one'
console.log(obj1 instanceof OneClass); // false
console.log(obj2 instanceof OneClass); // false
console.log(obj1 instanceof OtherClass); // true
console.log(obj2 instanceof OtherClass); // true
РлÑбом ÑлÑÑае, пока конеÑнÑй ÑезÑлÑÑÐ°Ñ Ð¾Ð´Ð¸Ð½ и ÑÐ¾Ñ Ð¶Ðµ, ÑÑÑеÑÑвÑÐµÑ Ð¾Ð´Ð½Ð¾ важное оÑлиÑие в ÑÑом пÑоÑеÑÑе. ÐÑи иÑполÑзовании Object.create()
и Function.prototype.apply()
, опеÑаÑÐ¾Ñ new.target
бÑÐ´ÐµÑ ÑказÑваÑÑ Ð½Ð° undefined
внÑÑÑи ÑÑнкÑии иÑполÑзÑемой в каÑеÑÑве конÑÑÑÑкÑоÑа, пока клÑÑевое Ñлово new
не бÑÐ´ÐµÑ Ð¸ÑполÑзовано Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑа.
С дÑÑгой ÑÑоÑонÑ, в ÑлÑÑае вÑзова Reflect.construct()
, опеÑаÑÐ¾Ñ new.target
бÑÐ´ÐµÑ ÑказÑваÑÑ Ð½Ð° паÑамеÑÑ newTarget
еÑли он задан, или target
в оÑлиÑном ÑлÑÑае.
function OneClass() {
console.log("OneClass");
console.log(new.target);
}
function OtherClass() {
console.log("OtherClass");
console.log(new.target);
}
var obj1 = Reflect.construct(OneClass, args);
// ÐÑвод:
// OneClass
// function OneClass { ... }
var obj2 = Reflect.construct(OneClass, args, OtherClass);
// ÐÑвод:
// OneClass
// function OtherClass { ... }
var obj3 = Object.create(OtherClass.prototype);
OneClass.apply(obj3, args);
// ÐÑвод:
// OneClass
// undefined
ÐÑимеÑÑ ÐÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Reflect.construct()
var d = Reflect.construct(Date, [1776, 6, 4]);
d instanceof Date; // true
d.getFullYear(); // 1776
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами СмоÑÑиÑе Ñакже
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4