有需求的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';