到目前为止,我已经通过以下方式在node.js
中创建了类和模块:
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
所以你创建了你的文件:
Animal.js
var fs = require('fs');
class Animal{
constructor(name){
this.name = name ;
}
print(){
console.log('Name is :'+ this.name);
}
}
这是正确的方法吗?
另外,如何将此类公开给我的节点项目中的其他文件?如果你在一个单独的文件中使用它,你仍然可以扩展这个类吗?
我希望你们中的一些人能够回答这些问题:)
答案 0 :(得分:106)
是的,你的例子可以正常工作。
至于暴露你的课程,你可以export
一个课程,就像其他任何课程一样:
class Animal {...}
module.exports = Animal;
或更短的:
module.exports = class Animal {
};
导入到另一个模块后,您可以将其视为在该文件中定义:
var Animal = require('./Animal');
class Cat extends Animal {
...
}
答案 1 :(得分:7)
只需处理ES6类名称,就像处理ES5方式中的构造函数名称一样。他们是一样的。
ES6语法只是语法糖,并创建完全相同的底层原型,构造函数和对象。
所以,在您的ES6示例中:
// animal.js
class Animal {
...
}
var a = new Animal();
module.exports = {Animal: Animal};
您可以像对象的构造函数一样对待Animal
(与您在ES5中的操作相同)。您可以导出构造函数。您可以使用new Animal()
调用构造函数。使用它的一切都是一样的。只有声明语法不同。甚至还有一个Animal.prototype
,它有你所有的方法。 ES6方式确实可以创建相同的编码结果,只需使用更高级/更好的语法。
在导入方面,这将使用如下:
const Animal = require('./animal.js').Animal;
let a = new Animal();
此方案将Animal构造函数导出为.Animal
属性,允许您从该模块导出多个内容。
如果您不需要导出多个内容,可以执行以下操作:
// animal.js
class Animal {
...
}
module.exports = Animal;
然后,将其导入:
const Animal = require('./animal.js');
let a = new Animal();
答案 2 :(得分:3)
ES6的需求方式是import
。您可以export
使用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';
答案 3 :(得分:0)
在节点中使用类-
在这里,我们需要ReadWrite模块并调用makeObject(),该对象将返回ReadWrite类的对象。我们正在使用它来调用方法。 index.js
const ReadWrite = require('./ReadWrite').makeObject();
const express = require('express');
const app = express();
class Start {
constructor() {
const server = app.listen(8081),
host = server.address().address,
port = server.address().port
console.log("Example app listening at http://%s:%s", host, port);
console.log('Running');
}
async route(req, res, next) {
const result = await ReadWrite.readWrite();
res.send(result);
}
}
const obj1 = new Start();
app.get('/', obj1.route);
module.exports = Start;
ReadWrite.js
在这里,我们制作了一个makeObject方法,该方法确保仅当对象不可用时才返回对象。
class ReadWrite {
constructor() {
console.log('Read Write');
this.x;
}
static makeObject() {
if (!this.x) {
this.x = new ReadWrite();
}
return this.x;
}
read(){
return "read"
}
write(){
return "write"
}
async readWrite() {
try {
const obj = ReadWrite.makeObject();
const result = await Promise.all([ obj.read(), obj.write()])
console.log(result);
check();
return result
}
catch(err) {
console.log(err);
}
}
}
module.exports = ReadWrite;
有关更多说明,请访问https://medium.com/@nynptel/node-js-boiler-plate-code-using-singleton-classes-5b479e513f74
答案 4 :(得分:0)
在课程文件中,您可以使用:
module.exports = class ClassNameHere {
print() {
console.log('In print function');
}
}
或者您可以使用此语法
class ClassNameHere{
print(){
console.log('In print function');
}
}
module.exports = ClassNameHere;
另一方面,要在任何其他文件中使用此类,您需要执行以下步骤。
首先使用以下语法要求该文件:
const anyVariableNameHere = require('filePathHere');
然后创建一个对象
const classObject = new anyVariableNameHere();
此后,您可以使用classObject
访问实际的类变量