猿问

Javascript 类与 Nodejs 中的函数“列表”

我是编程方面的新手,我目前想知道类与 NodeJ 中相关函数的简单“列表”的好处是什么。


作为非常简化的示例,我想如果我使用 Class,我会创建一个这样的用户:


class User {

    constructor(email) {

        this.email = email;

    }


    validateEmail() {

        // whatever function that checks if this.email is valid

        if (this.email === 'notValid') {

            throw new Error();

        }

        return this;

    }


    create() {

        this.validateEmail();

        // whatever function that inserts user in the database

        return user;

    }

}


const newUser = new User('test@test.com');

const user = newUser.create();

我会用我称之为相关函数的“列表”来做这样的事情:


const validateEmail = email => {

    // whatever function that checks if valid email

    if (email === 'notValid') {

        throw new Error();

    }

    return true;

};


const createUser = email => {

    if (validateEmail(email)) {

        // whatever function that inserts the user in the database

        return user;

    }

};


const user = createUser('test@test.com');

在我看来,第二种方式可以用更少的代码结束。甚至不必设置类。


假设我有一个节点 API,有多个“用户”路由和控制器。我想每次调用用户路由/控制器时我都必须实例化用户类,对吗?作为初学者,这对我来说听起来并不“优化”......但我肯定错过了一些东西......


守着一只汪
浏览 181回答 2
2回答

动漫人物

类将数据(this实例上的属性)与功能(每个实例的内部原型上的函数)联系起来。如果您没有与实例相关联的有意义的数据,那么拥有一个类就没有多大意义了。在这里,您确实有数据(电子邮件字符串)和相关函数 ( validateEmail),因此类是一个可能的选择,尽管当涉及更多属性和更多函数时它会更好。(如果只有一个属性,并且该属性仅存在以便可以使用该函数调用它,则类确实看起来确实没有必要冗长。)这样一个类的一个好处是,一旦你有了一个实例,你就可以将该实例传递给任何其他模块(或作用域),并且该模块可以调用与该实例相关的函数,而无需导入等效的独立函数。例如,假设您的 User 类的使用者位于不同的模块中,并且使用者希望能够创建用户并验证它们。然后,导出大量用户代码的模块要么必须(1) 导出许多独立的函数(这可能会变得有点乏味和难以管理),或者(2)只导出一个类能够仅导出一个类并让该类的任何用户或其实例使用与类相关的方法非常方便 - 这样,您不必每次需要使用与用户相关的函数时都传递多个值.想象一下,如果模块 A 需要能够创建用户,模块 B 需要能够验证用户,模块 C 需要能够检查用户是否已被验证。如果主用户文件为这些东西中的每一个创建和导出独立函数,并且每个消费模块导入他们需要调用的东西,事情就会有点难看。但是如果主 User 文件创建并导出了一个类,这将是微不足道的:用户(模块 A)的创建者将导入该类,实例化一个 object const user = new User('a@a.com'),并将其传递给模块 B,然后模块 B 可以调用user.validateEmail()(没有导入必要的)。然后最终用户实例被传递到模块 C,它调用user.checkIfUserIsValidated()(同样,不需要导入)。使用 Class 方法,在同一对象(类实例)上拥有一个同时具有实例数据和相关函数的对象可以使代码更清晰。当然,如果您不想,您永远不必使用类,但这是一个可能的好处。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答