javascript Node.js ES6类,需要

s6fujrry  于 2023-03-06  发布在  Java
关注(0)|答案(5)|浏览(145)

所以到目前为止,我已经用以下方法在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
因此您创建了文件:

动物.js

var fs = require('fs');
class Animal{

 constructor(name){
    this.name = name ;
 }

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

这条路对吗?
另外,如何将这个类公开给节点项目中的其他文件?如果在单独的文件中使用这个类,您还能扩展它吗?
我希望你们中的一些人能够回答这些问题:)

9gm1akwq

9gm1akwq1#

是的,你的例子很好。
至于公开类,你可以像处理其他事情一样处理一个类:

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

或更短的:

module.exports = class Animal {

};

导入到另一个模块后,您可以将其视为在该文件中定义的:

var Animal = require('./Animal');

class Cat extends Animal {
    ...
}
r9f1avp5

r9f1avp52#

只要把ES6的类名当作ES5中的构造函数名来处理,它们是同一个。
ES6语法只是语法糖,它创建了完全相同的底层原型、构造函数和对象。
因此,在您的ES6示例中:

// animal.js
class Animal {
    ...
}

var a = new Animal();

module.exports = {Animal: Animal};

或者,出口报关单可缩短为:

module.exports = { Animal };

您可以将Animal视为对象的构造函数(和你在ES5中做的一样)。你可以导出构造函数。你可以用new Animal()来调用构造函数。使用它的一切都是一样的。只是声明语法不同。甚至还有一个Animal.prototype,它上面有你所有的方法。ES6的方式确实产生了相同的编码结果。只是语法更好。
在导入端,将按如下方式使用:

const Animal = require('./animal.js').Animal;

let a = new Animal();

或者,它可以只是:

const { Animal } = require('./animal.js');

let a = new Animal();

此方案将Animal构造函数导出为.Animal属性,该属性允许您从该模块中导出多个内容。
如果不需要导出多个内容,可以执行以下操作:

// animal.js
class Animal {
    ...
}

module.exports = Animal;

然后,使用以下命令导入:

const Animal = require('./animal.js');

let a = new Animal();
dgjrabp2

dgjrabp23#

ES6的require方式是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';
uklbhaso

uklbhaso4#

在节点中使用类-
在这里,我们需要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;
  • 读写.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

h6my8fg2

h6my8fg25#

在类文件中,您可以用途:

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访问实际的类变量

相关问题