我将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
为什么我会两次获得相同的输出?
我可能尚未理解模块和范围,欢迎提供任何关于文档的提示
答案 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)
有几件事需要更新。首先,在模块范围内使用var
,const
或let
关键字声明变量时,这些变量仅对模块本身是本地的。将它们视为“私人”。因此,您的pose
,eye
和left
变量仅在模块中 可见。同样返回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));
请注意,这几乎是一个基本的例子,你可以扩展它。但是,此代码假定您在整个应用程序中需要多个模块实例。