看阮一峰 ES6教程,模块的继承部分。没看到有继承,子模块和父模块没有重名的函数或者属性,也没有从子模块访问父模块的东西。
所以自己做了个例子,验证。说实话,我只看到了调用链,没看到有继承。
// circle.mjs
export function area(radius) {
return Math.PI * radius * radius;
}
export var e = 1;
export default function(x) {
return Math.exp(x);
}
父模块circle.mjs有area函数,e属性,默认输出。
// circleplus.mjs
import * as circle from './circle.mjs';
export var e = 2.71828182846;
export default function(x) {
console.log('我是子类default')
console.log('x:'+x)
return Math.exp(x);
}
export function area(radius) {
console.log('我是子类area()')
return Math.PI * radius * radius;
}
子模块circleplus.mjs 引入了父模块circle.mjs。并且有自己的area函数,e属性,默认输出。
使用时,按照继承的含义,应该只需要引入子模块。
//main.mjs
import * as aaa from './circleplus.mjs';
import exp from './circleplus.mjs';
console.log(exp(aaa.e));
aaa.area(1)
可以正常使用,但是其实这里没有继承,只是调用链而已,main.mjs中引入circleplus.mjs,当然可以使用circleplus.mjs中的东西。而circleplus.mjs又引入了circle.mjs,自然也可以使用circle.mjs中的东西。
如果是子模块继承父模块,那么子模块应该自动就有父模块的属性和函数。
让我们看看这个例子
// circle.mjs
export function A() {
console.log('我是父模块A()')
}
// circleplus.mjs
import { A } from './circle.mjs';
//main.mjs
import * as aaa from './circleplus.mjs';
aaa.A()
上述代码中父模块circle.mjs输出A函数,子模块circleplus.mjs引入了父模块。main.js中引入了子模块,却访问不了A函数。
怎样才能访问到呢?
改一下子模块就可以,让子模块也输出父模块。但这样做不就又变成调用链了么,没有继承啊!
// circleplus.mjs
export { A } from './circle.mjs';
子模块也不能覆盖父模块同名属性或者函数。下面代码是没法使用的,会提示“Identifier 'A' has already been declared”
// circleplus.mjs
import {A} from './circle.mjs';
export function A() {
console.log('我是子模块A()')
}