模块的继承

看阮一峰 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()')
}


版权声明:本文为yangguosheng原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。