new.target

من موسوعة حسوب

الخاصية new.target تسمح لك بمعرفة إن استدعيت دالةٌ عاديةٌ أم دالةٌ بانيةٌ باستخدام المعامل new، ففي الدوال البانية التي تُهيَّئ باستخدام المعامل new ستعيد الخاصية new.target مرجعيةً إلى الدالة البانية، أما الدوال العادية فستكون قيمة الخاصية new.target هي undefined.

البنية العامة

new.target

الوصف

التعبير new.target يحتوي على الكلمة المحجوزة new ثم نقطة ثم اسم الخاصية target، لاحظ أنَّ هذا الشكل قد يبدو من الوهلة الأولى على أنها وصولٌ إلى خاصيات أحد الكائنات، لن الكلمة المحجوزة new ليست كائنًا.

الخاصية new.target هي خاصية وصفية متوافرة لجميع الدوال؛ وستشير الخاصية new.target في الدوال السهمية إلى قيمة new.target للدالة المُحيطة بالدالة السهمية.

أمثلة

new.target عند استدعاء الدوال

عند استدعاء الدوال العادية (أي أنَّ الدالة ليست دالةً بانيةً)، فستكون قيمة new.target هي undefined، وهذا يسمح بمعرفة إن استدعيت هذه الدالة باستخدام المعامل new كدالة بانية:

function Foo() {
  if (!new.target) throw 'Foo() must be called with new';
  console.log('Foo instantiated with new');
}

Foo(); // throws "Foo() must be called with new"
new Foo(); // logs "Foo instantiated with new"

new.target في الدوال البانية

تُشير الخاصية new.target في الدوال البانية للأصناف إلى الدالة البانية التي اُستدعيت مباشرةً عبر المعامل new، وهذا ينطبق على الدالة البانية التي تكون في الصنف الأب التي استدعيت من الدالة البانية للصنف الابن:

class A {
  constructor() {
    console.log(new.target.name);
  }
}

class B extends A { constructor() { super(); } }

var a = new A(); // logs "A"
var b = new B(); // logs "B"

class C { constructor() { console.log(new.target); } }
class D extends C { constructor() { super(); } }
 
var c = new C(); // logs class C{constructor(){console.log(new.target);}}
var d = new D(); // logs class D extends C{constructor(){super();}}

لاحظ من المثال السابق في الصنفين C و D أنَّ الخاصية new.target تُشير إلى تعريف الصنف الذي تمت تهيئته، فعند تهيئة الصنف D باستخدام المعامل new فسيُعرَض تعريف الصنف D، والمثل ينطبق على الصنف C.

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي 46 41 غير مدعومة نعم نعم

على النقيض من متصفح IE، يدعم متصفح Edge هذه الميزة.

مصادر ومواصفات