javascript - معلم - مميزات الجافا سكريبت




جافا سكريبت: ما هو الفرق بين.call() والسوبر()؟ (2)

ما هو الفرق بين .call () والسوبر ()؟ هو السوبر () مجرد شيء es2015؟ أو هل .call () لديها المزيد من الوظائف؟


أتصور أن تتصل call super بسبب رمز مثل ما يلي:

function Foo() {
   Bar.call(this)
}

class Foo extends Bar {
   constructor() {
      super()
   }
 }

في الحالة أعلاه، كلا المثالين تفعل الشيء نفسه (استدعاء منشئ Bar في سياق مثيل جديد من Foo )، ولكن من هناك super call تختلف اختلافا كبيرا.

أولا قبالة super هو كلمة رئيسية، call هي طريقة Function النموذج.

يمكن استخدام الكلمة الرئيسية super لاستدعاء منشئ الطبقات الرئيسية والأساليب. لذلك، بالإضافة إلى الأمثلة أعلاه سوبر يمكن القيام بذلك:

class Bar {
  constructor() {
    //...
  }

  bang() {
    console.log('bang')
  }
}

class Foo extends Bar {
  constructor() {
    super()
    //...
  }

  bang() {
    // call parents method in context of `this`
    super.bang()

    //...
  }
}

، من ناحية أخرى، هو أسلوب فئة Function التي تسمح call دالة مع قيمة صريحة this المتغير. النظر في الدالة التالية.

function baz() { console.log(this.bar) }
baz() // -> "undefined"
baz.call({ bar: 'foo' }) // -> "foo"

المثال أعلاه هو في الواقع قليلا أكثر دقة. ما لم يكن في وضع صارم، this سيكون الكائن global ( global ، window ). في وضع صارم، this هو وندفيند، وسوف لدينا وظيفة baz رمي خطأ. مع call التي يمكن أن تحدد بوضوح this ، ميزة قوية جدا.


  • سوبر () يدعو منشئ الفئة التي استكملت

    class Foo extends Bar {
      constructor() {
        super();  // calls Bar's constructor
      }
     }
  • المكالمة هي وظيفة عامة يمكنك استخدامها مع أي وظيفة

    function a() { console.log(this); };
    function b() { console.log(this); };
    function c() { console.log(this}; };
    
    a.call("hello");
    b.call(123);
    c.call({});
  • سوبر يعرف أي فئة كنت ورثت من وتلقائيا يمر الصحيح this .

    class Foo extends Bar {
      constructor() {
        super();  // calls Bar's constructor
      }
    }
  • تتطلب المكالمة أن تكون صريحة.

    class Foo extends Bar {
      constructor() {
        Bar.call(this);  // You had explicitly specify 'Bar' 
                         // and explicitly pass 'this'
      }
    }
  • سوبر يتيح لك استدعاء وظائف على الأصل ضمنا

    class Bar {
      log() { 
        console.log("bar-log");
      }
    }
    
    class Foo extends Bar {
      log() {
        super.log();
      }
    }
  • تتطلب المكالمة أن تكون صريحة

    class Bar {
      log() { 
        console.log("bar-log");
      }
    }
    
    class Foo extends Bar {
      log() {
        Bar.prototype.log.call(this);  // Explicitly reference bar's log function
                                       // and explicitly specify 'this'
      }
    }

أعتقد أنك يمكن أن يجادل super يقدم مجموعة فرعية من وظيفة call . قد يطلق عليه البعض السكر النحوي مما يعني أنه يمكنك استخدام call كل مكان يمكنك استخدام super والسوبر هو مجرد أسهل لأنه يدعو ضمنا الاشياء من فئة كنت تمديد / ورثت من (من الناحية الفنية الشيء التالي حتى سلسلة النموذج؟) ولأنها تمنع ضمنا this لك.







babel