javascript - Nodejs 中从模块导出变量的优雅方法

标签 javascript node.js module

我想在使用 Node.js 中的一个模块的参数初始化后导出一个变量。

现在,我有三个选择。

选项 1:直接导出

// moduletest.js

exports.init = function(v, w) {
    // actually, the value of a and b could be initialized by other functions.
    // here is one example, simply assign them with v and w just for test
    exports.a = v;
    exports.b = w;
}

变量ab可以在模块外使用。

// app.js
require('./moduletest').init(3, 1);

var ff = require('./moduletest');

console.log(ff.a);
console.log(ff.b);

选项 2:var 对象中的一个 get 方法。

var MyObject = {
    init: function(a, b) {
        this._a_ = a;
        this._b_ = b;
    },

    getA: function () {
        return this._a_;
    },
};

exports.mod = {
    valA: MyObject.getA,
    init: MyObject.init
}

变量_a_可以通过getA方法访问。

选项 3:通过函数原型(prototype)中的一个 get 方法。

var Test = function (a, b){
    this._a_ = a;
    this._b_ = b;
};

Test.prototype.getA = function()
{
    return this._a_;
}

exports.mod = Test;

这里我有两个问题:

  • 哪一种方法更优雅?
  • 如果以上三种方案都不好,还有更好的方法吗?

最佳答案

根据对您问题的评论,一种可能的方法如下。您的主要问题是您实际上没有隐藏数据,从而让用户可以修改它们。

module.exports = function (_a, _b) {
    return function() {
        var obj = { };
        Object.defineProperty(obj, 'a', {
            get: function () { return _a; }
        });
        Object.defineProperty(obj, 'b', {
            get: function () { return _b; }
        });
    };
}

您可以按如下方式使用它:

var factory = require('file_above')(your_a, your_b);
// code
var instance = factory();
// you cannot modify a or b on instance!!

类似的事情可以通过使用函数的bind方法等来完成。请记住,有很多可能的解决方案,但没有一个是正确的,但几乎所有解决方案都是有效的。

据我所知,无论如何,您上面发布的那些都存在一些小问题,当然,尽管它们都工作正常。

关于javascript - Nodejs 中从模块导出变量的优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33429957/

相关文章:

javascript - 在没有文件的情况下从 HTML5 中的 javascript 播放音频 - 使用缓冲区

java - Java 匹配与 JavaScript 匹配之间的结果差异

node.js - 如何将 GraphQL 连接到 MySQL

types - Coq 中的类型封装

javascript - React Checkbox 触发正则表达式

javascript - 为什么汉堡包菜单 block 在打开时不显示?

node.js - 使用 XMLHttpRequest 2 设置 Cookie

angularjs - 每次新建项目都要安装express、node等吗?

drupal - 在 Drupal 6 中发布之前创建页面的草稿版本?

java - 无法理解 java 项目/IntelliJ 中外部库的用法