通常把 super 看作只与类相关。但是,鉴于 JavaScript 的原型类而非类对象的本质,super对于普通(plain)对象的简洁方法也一样有效,特性也基本相同。看代码:
var o1 = {
foo() {
console.log( "o1:foo" );
}
};
var o2 = {
foo() {
super.foo();
console.log( "o2:foo" );
}
};
Object.setPrototypeOf( o2, o1 );
o2.foo(); // o1:foo
// o2:foo
注:foo(){..}是ES6新增语法,相当于 function foo(){...},但是只有foo(){...}才可以调用super();这种方式又叫 简洁方法,super 只允许在简洁方法中出现,而不允许在普通函数表达式属性中出现。也只允许以 super.XXX 的形式(用于属性 / 方法访问)出现,而不能以super() 的形式出现。
o2.foo() 方法中的 super 引用静态锁定到 o2,具体说是锁定到 o2 的 [[Prototype]]。基本上这里的 super 就是 Object.getPrototypeOf(o2)——当然会决议到 o1——这是它如何找到并调用 o1.foo() 的过程。