الكلمة المحجوزة super في JavaScript

من موسوعة حسوب
مراجعة 04:24، 17 يناير 2018 بواسطة عبد اللطيف ايمش (نقاش | مساهمات)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

الكلمة المحجوزة 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 هذه الميزة.

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