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

时间:2016-06-26 00:08:57

标签: javascript ecmascript-6 babel

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

2 个答案:

答案 0 :(得分:10)

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

    class Foo extends Bar {
      constructor() {
        super();  // calls Bar's constructor
      }
     }
    
  • call是一个通用函数,可以与任何函数

    一起使用
    function a() { console.log(this); };
    function b() { console.log(this); };
    function c() { console.log(this}; };
    
    a.call("hello");
    b.call(123);
    c.call({});
    
  • super知道您从哪个类继承并自动传递正确的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'
      }
    }
    
  • super允许您隐式调用父项上的函数

    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

答案 1 :(得分:3)

我认为您与callsuper有关,因为代码如下:

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

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

在上面的例子中,两个示例都做同样的事情(在Bar的新实例的上下文中调用Foo的构造函数),但从那里super和{{ 1}}差别很大。

首先关闭call是关键词,supercall原型的方法。

Function关键字可用于调用父类构造函数和方法。所以,除了上面的例子,super可以做到这一点:

super
另一方面,

class Bar { constructor() { //... } bang() { console.log('bang') } } class Foo extends Bar { constructor() { super() //... } bang() { // call parents method in context of `this` super.bang() //... } } call类的一种方法,它允许使用Function变量的显式值调用函数。请考虑以下功能。

this

上面的例子实际上有点细微差别。除非在严格模式下,function baz() { console.log(this.bar) } baz() // -> "undefined" baz.call({ bar: 'foo' }) // -> "foo" 将成为全局对象(thisglobal)。在严格模式下,window未定义,我们的this函数将抛出错误。使用baz,我们可以明确设置call,这是一个非常强大的功能。