super关键字
指向定义时所在对象的原型对象
:::info
只能用在对象的方法简写中或者 class
中,用在其它地方会报错:Uncaught SyntaxError: 'super' keyword unexpected here
:::
let obj = {
a: 'hello',
foo(){
return super.a
}
}
Object.setPrototypeOf(obj, {a: 'dva'}) // 将{a: 'dva'}设置为obj的原型对象
obj.foo() // dva
obj.foo.call({a:'123'})
super
和this
关键字没有关系
let obj2 = {}
Object.setPrototypeOf(obj2, {a: '12'})
obj.foo.call(obj2) // "dva"
有空研究下babel中如何实现的super
关键字
let obj = {
foo: '23',
a() {
return super.foo
}
}
// babel 转义后
"use strict";
var _obj;
function _get(target, property, receiver) {
if (typeof Reflect !== "undefined" && Reflect.get) {
_get = Reflect.get;
} else {
_get = function _get(target, property, receiver) {
var base = _superPropBase(target, property);
if (!base) return;
var desc = Object.getOwnPropertyDescriptor(base, property);
if (desc.get) {
return desc.get.call(receiver);
}
return desc.value;
};
}
return _get(target, property, receiver || target);
}
function _superPropBase(object, property) {
while (!Object.prototype.hasOwnProperty.call(object, property)) {
object = _getPrototypeOf(object);
if (object === null) break;
}
return object;
}
function _getPrototypeOf(o) {
_getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf: function _getPrototypeOf(o) {
return o.__proto__ || Object.getPrototypeOf(o);
};
return _getPrototypeOf(o);
}
var obj = _obj = {
foo: '23',
a: function a() {
return _get(_getPrototypeOf(_obj), "foo", this);
}
};
class中的super
- 用作函数,指向父类的构造函数。ES6 规定使用extend关键字继承时,必须调用一次super。
- 用作对象
- 类的普通方法中,指向父类的原型对象
- 类的静态方法中,指向父类