الكلمة المحجوزة super
في JavaScript
الكلمة المحجوزة super
تُستخدَم للوصول إلى الكائنات في الكائن الأب واستدعائها. يمكن استخدام التعبيرين super.prop
و super[expr]
في الأصناف والكائنات.
البنية العامة
super([arguments]); // استدعاء الدالة البانية للكائن الأب
super.functionOnParent([arguments]);
الوصف
عند استخدام الكلمة المحجوزة super
في الدالة البانية فيجب أن تُستخدَم قبل أيّ استخدام للكلمة المحجوزة this
، ويمكن أن تُستخدَم الكلمة المحجوزة super
لاستدعاء الدوال التابعة للكائن الأب أيضًا.
أمثلة
استخدام super
في الأصناف
عند استدعاء الدوال العادية (أي أنَّ الدالة ليست دالةً بانيةً)، فستكون قيمة new.target
هي undefined
، وهذا يسمح بمعرفة إن استدعيت هذه الدالة باستخدام المعامل new
كدالة بانية:
class Polygon {
constructor(height, width) {
this.name = 'Polygon';
this.height = height;
this.width = width;
}
sayName() {
console.log('Hi, I am a ', this.name + '.');
}
}
class Square extends Polygon {
constructor(length) {
// يجب استدعاء الدالة البانية للصنف الأب أولًا
this.height; // ReferenceError
// سنستدعي الدالة البانية للصنف الأب
super(length, length);
// لاحظ أنَّك أصبحت تستطيع استخدام الكلمة المحجوزة this
this.name = 'Square';
}
get area() {
return this.height * this.width;
}
set area(value) {
this.height = this.width = Math.sqrt(value);
}
}
استدعاء الدوال الساكنة
يمكنك استخدام super
لاستدعاء الدوال الساكنة:
class Human {
constructor() {}
static ping() {
return 'ping';
}
}
class Computer extends Human {
constructor() {}
static pingpong() {
return super.ping() + ' pong';
}
}
Computer.pingpong(); // 'ping pong'
لا يمكن حذف خاصيات super
لا يمكنك استخدام معامل الحذف مع التعبيرين super.prop
و super[expr]
لحذف خاصية من خاصيات الصنف الأب، إذ سيؤدي ذلك إلى رمي ReferenceError
:
class Base {
constructor() {}
foo() {}
}
class Derived extends Base {
constructor() {}
delete() {
delete super.foo;
}
}
new Derived().delete(); // ReferenceError: invalid delete involving 'super'.
لا يمكن الكتابة على الخاصية غير القابلة للكتابة باستخدام super
عند تعريف خاصيات غير قابلة للكتابة (عبر الدالة Object.defineProperty()
مثلًا)، فلن تتمكن super
من إعادة الكتابة فوق قيمة تلك الخاصية.
class X {
constructor() {
Object.defineProperty(this, 'prop', {
configurable: true,
writable: false,
value: 1
});
}
f() {
super.prop = 2;
}
}
var x = new X();
x.f(); // TypeError: "prop" is read-only
console.log(x.prop); // 1
استخدام super
على الكائنات المُنشَأة بالصيغة المختصرة
يمكن أن تُستخدَم super
ضمن تعبير تهيئة الكائنات، ففي المثال الآتي لدينا كائنين لكلِ واحدٍ منها دالةٌ، وفي الكائن الثاني استدعينا دالة الكائن الأولى عبر super
، وذلك بمساعدة الدالة Object.setPrototypeOf()
التي ضبطت قيمة الخاصية prototype
للكائن obj2
إلى obj1
، لذا تمكنت الكلمة المحجوزة super
من العثور على الدالة method1
في الكائن obj1
:
var obj1 = {
method1() {
console.log('method 1');
}
}
var obj2 = {
method2() {
super.method1();
}
}
Object.setPrototypeOf(obj2, obj1);
obj2.method2(); // logs "method 1"
دعم المتصفحات
الميزة | Chrome | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
الدعم الأساسي | 42 | 45 | غير مدعومة | نعم | نعم |
على النقيض من متصفح IE، يدعم متصفح Edge هذه الميزة.
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).