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() // dvaobj.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。
- 用作对象
- 类的普通方法中,指向父类的原型对象
- 类的静态方法中,指向父类
