.call()和super()有什么区别? super()只是es2015的东西吗?或者.call()有更多功能吗?
答案 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)
我认为您与call
和super
有关,因为代码如下:
function Foo() {
Bar.call(this)
}
class Foo extends Bar {
constructor() {
super()
}
}
在上面的例子中,两个示例都做同样的事情(在Bar
的新实例的上下文中调用Foo
的构造函数),但从那里super
和{{ 1}}差别很大。
首先关闭call
是关键词,super
是call
原型的方法。
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"
将成为全局对象(this
,global
)。在严格模式下,window
未定义,我们的this
函数将抛出错误。使用baz
,我们可以明确设置call
,这是一个非常强大的功能。