在发布此问题之前,我已在SO上阅读了几篇帖子。我不清楚的一件事是,为什么我在将其作为模块导入时无法使用乘法函数。不是module.exports和exports引用同一个对象吗?
不应该多次添加到module.exports引用的对象。由于exports是module.exports的别名,我原以为我正在添加多个相同的对象,因为我没有重新分配导出以引用其他内容。
module.exports = {
sum : function(a,b){
return a+b;
}
};
exports.multiply = function(a,b){
return a*b;
};
答案 0 :(得分:1)
请注意,在每个nodejs模块文件的开头,export和module.exports都指向同一个空对象。您可以为它们分配属性,如下所示:
exports.item1 = "hi1"
module.exports.item2 = "hi2"
现在两个exports和module.exports都具有相同的值:
{item1:"hi1", item2: "hi2"}
但是当你为它们分配对象时,只有你给module.exports的对象很重要!在您的情况下,如果要将对象分配给module.exports然后向其添加其他函数,则应首先将同一对象分配给它们!现在,它们将指向同一个对象,如果您为export对象分配另一个函数,它也可以通过module.exports对象访问。
更改代码的第一行,它会正常工作!
exports = module.exports = {
sum : function(a,b){
return a+b;
}
};
exports.multiply = function(a,b){
return a*b;
};
答案 1 :(得分:0)
您无法访问乘法函数,因为javascript对象是通过引用传递的。当您使用行module.exports = {blah}时,您创建一个新对象{blah}并将module.exports设置为指向它。但是,出口仍然指向旧的对象。
最初,module.exports和exports指向同一个空对象。 因此,exports = {},module.exports = {}。但是当你创建一个新对象并让module.exports指向它时,例如:
((Xamarin.Forms.NavigationPage)MyProject.App.Current.MainPage).Pushed += (s, e) =>
{
if (e.Page is ContentPage)
{
// Do what you gotta do
}
// or, for a specific page:
if (e.Page is MyProject.Views.MyCustomPage)
{
// Do what you gotta do
}
};
module.exports将指向新对象,但导出仍将指向旧对象:
module.exports = {
sum : function(a,b){
return a+b;
}
};
然后:
// exports will still point to the old object
console.log(exports) // prints {}
console.log(module.exports) // prints { sum: function() }
导入模块时,会返回module.exports中的值,因此您无法访问乘法函数,因为它是在exports中定义的,它引用了不同的对象。
如果您不想担心此问题,可以这样做:
console.log(exports) // prints {}
exports.multiply = function(a,b){
return a*b;
};
console.log(exports) // prints { multiply: function() }
这将使它们引用相同的对象。因此,
exports = module.exports = {
sum : function(a,b){
return a+b;
}
};
将正常工作。