Javascript:.call()和super()有什么区别?

Nic*_*ova 4 javascript babel ecmascript-6

.call()和super()之间有什么区别?super()只是es2015的东西吗?或者.call()有更多功能吗?

gma*_*man 11

  • super()调用您扩展的类的构造函数

    class Foo extends Bar {
      constructor() {
        super();  // calls Bar's constructor
      }
     }
    
    Run Code Online (Sandbox Code Playgroud)
  • call是一个泛型函数,可以用于任何函数

    function a() { console.log(this); };
    function b() { console.log(this); };
    function c() { console.log(this}; };
    
    a.call("hello");
    b.call(123);
    c.call({});
    
    Run Code Online (Sandbox Code Playgroud)
  • super知道你从哪个类继承并自动传递正确的类this.

    class Foo extends Bar {
      constructor() {
        super();  // calls Bar's constructor
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 电话要求你明确.

    class Foo extends Bar {
      constructor() {
        Bar.call(this);  // You had explicitly specify 'Bar' 
                         // and explicitly pass 'this'
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • super允许您隐式调用父项上的函数

    class Bar {
      log() { 
        console.log("bar-log");
      }
    }
    
    class Foo extends Bar {
      log() {
        super.log();
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 电话要求你明确

    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'
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

我认为你可以争辩super提供一部分功能call.有些人可能会把它称为语法糖意味着你可以使用你可以使用的call任何地方super,超级只是更容易,因为它隐式调用你扩展/继承的类中的东西(技术上是原型链中的下一个东西?),因为它隐含地传递this给你.