2016-09-22 42 views
0

我有一个简化为人眼姿势的javascript模块。在Node js中使用模块并重新分配值

var pose = {}; 
var eye = {}; 
var left = {}; 
left.pitchPos = 37; 
left.yawPos = 47; 

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

exports.eye = function (e) { 
    if(typeof(e) !== "undefined"){ 
     pose.eye = e;  
    } 
    return pose; 
}; 

exports.pose = pose; 

这是我如何使用它:

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

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

潜在我不明白的模块和范围的是,在文档的任何暗示是值得欢迎的

+0

你期待'this'提及什么? –

回答

1

“问题”是在这个函数this关键字的错误用法:

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

在这个返回this上下文的意思是“返回模块本身”。这意味着,你的任务(​​)做这样的事情(在pose.js文件的情况下):

exports.eye.left = ... 

exports.eye是一个函数,所以在结果你给函数eye分配新成员(这是可能的,因为JavaScript的函数是对象)。


一个适当的分配(没有pose.js文件修改)应该是这样的:

pose.pose.eye.left = ... 
+0

非常感谢。任何暗示在哪里可以找到一个关于propper创建javascript模块的文档? – user3732793

+0

你的代码**是一个合适的模块。你只需要小心''this''关键字。 – mdziekon

+0

谢谢。我会注意那 – user3732793

1

有一对夫妇的需要更新的东西。首先在模块范围内使用varconstlet关键字声明变量时,这些变量仅在本地模块本地使用。把它们想象成“私人”。所以你的pose,eyeleft变量只可见里面的你的模块。也返回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)); 

请注意,是相当多的一个基本的例子你可以扩展它。但是,这段代码假设您需要在应用程序中使用多个模块实例。

+0

谢谢你的支持 – user3732793

相关问题