有需求的Node.js ES6类

到目前为止,我已经通过以下方式在node.js创build了类和模块:

  var fs = require('fs'); var animalModule = (function () { /** * Constructor initialize object * @constructor */ var Animal = function (name) { this.name = name; }; Animal.prototype.print = function () { console.log('Name is :'+ this.name); }; return { Animal: Animal } }()); module.exports = animalModule; 

现在用ES6,你可以像这样做“实际”类:

 class Animal{ constructor(name){ this.name = name ; } print(){ console.log('Name is :'+ this.name); } } 

现在,首先,我喜欢这个:)但它提出了一个问题。 你如何使用这个结合node.js的模块结构?

假设你有一个你希望使用模块的例子,为了演示,你想使用fs

所以你创build你的文件:


Animal.js

 var fs = require('fs'); class Animal{ constructor(name){ this.name = name ; } print(){ console.log('Name is :'+ this.name); } } 

这是正确的吗?

另外,如何将这个类暴露给我的节点项目中的其他文件? 如果你在一个单独的文件中使用它,你仍然可以扩展这个类吗?

我希望你们中的一些人能够回答这些问题:)

是的,你的例子会正常工作。

至于暴露你的类,你可以像其他任何东西一样export一个类:

 class Animal {...} exports.Animal = Animal; 

或者更短:

 exports.Animal = class { }; 

但是如果你需要在文件的其他地方引用这个类,这可能不起作用。

一旦导入到另一个模块中,就可以将它视为在该文件中定义的那样:

 var { Animal } = require('./Animal'); class Cat extends Animal { ... } 

只要将ES6类的名称与您以ES5方式处理构造函数名相同即可。 他们是一样的。

ES6语法只是语法糖,并创build完全相同的底层原型,构造函数和对象。

所以,在你的ES6例子中:

 class Animal { ... } var a = new Animal(); module.exports = {Animal: Animal}; 

你可以像对待你的对象的构造函数一样对待Animal (就像你在ES5中做的一样)。 你可以导出构造函数。 你可以用new Animal()调用构造函数。 一切都是一样的使用它。 只有声明语法是不同的。 甚至还有一个Animal.prototype ,它有你所有的方法。 ES6的方式确实创造了相同的编码结果,只是用更好的/更好的语法。

需求的ES6方式是import 。 您可以export您的类,并使用import { ClassName } from 'path/to/ClassName'语法中的import { ClassName } from 'path/to/ClassName'将其导入其他位置。

 import fs from 'fs'; export default class Animal { constructor(name){ this.name = name ; } print(){ console.log('Name is :'+ this.name); } } import Animal from 'path/to/Animal.js';