在节点js中使用模块并重新分配值

时间:2016-09-22 15:41:55

标签: javascript node.js

我将javascript模块简化为眼睛姿势。

var pose = require('./pose').init();
console.log(JSON.stringify(pose));
pose.eye.left = { yawPos: 99, pitchPos: 11 };
console.log(JSON.stringify(pose));

这就是我使用它的方式:

http://forums.pentaho.com/showthread.php?74743-How-to-split-a-stream-into-two-table-outputs

为什么我会两次获得相同的输出?

我可能尚未理解模块和范围,欢迎提供任何关于文档的提示

2 个答案:

答案 0 :(得分:1)

"问题"在此函数中使用this关键字时出错:

exports.init = function () { 
    eye.left = left;
    pose.eye = eye;
    return this;
};

在此上下文中返回this表示"返回模块本身"。这意味着您的作业(pose.eye.left = ...)执行类似的操作(在pose.js文件的上下文中):

exports.eye.left = ...

exports.eye是一个函数,因此在结果中您将为函数eye分配一个新成员(这是可能的,因为JavaScript的函数是对象)。

正确的分配(pose.js文件中没有修改)将如下所示:

pose.pose.eye.left = ...

答案 1 :(得分:1)

有几件事需要更新。首先,在模块范围内使用varconstlet关键字声明变量时,这些变量仅对模块本身是本地的。将它们视为“私人”。因此,您的poseeyeleft变量仅在模块中 可见。同样返回this将返回当前模块,基本上所有通过exports属性链接的所有内容(我认为)。

我建议做的是这样的事情:

module.js

function Module() {
    this.pose = {
        eye: {
            left: {
                pitchPos: 37,
                yawPos: 47
            }
        }
    }
}

Module.prototype.setLeftEye = function(pitchPos, yawPos) {
    this.pose.eye.left.pitchPos = pitchPos;
    this.pose.eye.left.yawPos = yawPos;
}

module.exports = Module;

以及您使用它的地方:

var Module = require('./mod');

var mod = new Module();

console.log(JSON.stringify(mod.pose));
mod.setLeftEye(99, 11);
console.log(JSON.stringify(mod.pose));

请注意,这几乎是一个基本的例子,你可以扩展它。但是,此代码假定您在整个应用程序中需要多个模块实例。