Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js-将module.exports用作构造函数_Javascript_Node.js_Commonjs - Fatal编程技术网

Javascript Node.js-将module.exports用作构造函数

Javascript Node.js-将module.exports用作构造函数,javascript,node.js,commonjs,Javascript,Node.js,Commonjs,根据Node.js手册: 如果希望模块导出的根是函数(例如 一个构造函数),或者如果您想在一个 指定而不是一次构建一个属性,而是将其指定给 module.exports而不是exports 举例如下: // file: square.js module.exports = function(width) { return { area: function() { return width * width; } }; } 使用方法如下: var square

根据Node.js手册:

如果希望模块导出的根是函数(例如 一个构造函数),或者如果您想在一个 指定而不是一次构建一个属性,而是将其指定给 module.exports而不是exports

举例如下:

// file: square.js
module.exports = function(width) {
  return {
    area: function() {
      return width * width;
    }
  };
}
使用方法如下:

var square = require('./square.js');
var mySquare = square(2);
console.log('The area of my square is ' + mySquare.area());
我的问题:为什么示例不使用正方形作为对象?以下内容有效吗?它是否使示例更“面向对象”


这个问题实际上与
require()
的工作方式无关。基本上,无论您在模块中设置了什么
module.exports
,它都将从
require()
调用返回

这相当于:

var square = function(width) {
  return {
    area: function() {
      return width * width;
    }
  };
}
调用
square
时,不需要使用
new
关键字。您不是从
square
返回函数实例本身,而是在最后返回一个新对象。因此,您可以直接调用此函数


有关
new
的更复杂的参数,请查看:

CommonJS模块允许两种方法定义导出的属性。在这两种情况下,您都返回一个对象/函数。因为函数是JavaScript中的头等公民,所以它们可以像对象一样工作(从技术上讲,它们是对象)。也就是说,您关于使用
新的
关键字的问题有一个简单的答案:是的。我将举例说明

模块导出 您可以使用提供的
exports
变量将属性附加到它。一旦在另一个模块中需要,这些分配属性将变为可用。也可以将对象指定给module.exports属性。在任何一种情况下,
require()
返回的都是对
module.exports
值的引用

如何定义模块的伪代码示例:

var theModule = {
  exports: {}
};

(function(module, exports, require) {

  // Your module code goes here

})(theModule, theModule.exports, theRequireFunction);
在上面的示例中,
module.exports
exports
是同一个对象。很酷的一点是,您在CommonJS模块中看不到任何这些,因为整个系统都会处理这些问题。您需要知道的是,有一个模块对象具有exports属性和一个exports变量,该变量指向module.exports所做的事情

需要与构造函数一起使用 由于您可以将函数直接附加到
模块。导出
,因此您基本上可以返回一个函数,并且与任何函数一样,它可以作为构造函数进行管理(这是斜体字,因为函数和JavaScript中的构造函数之间的唯一区别是您打算如何使用它。从技术上讲没有区别。)

因此,以下是非常好的代码,我个人鼓励它:

// My module
function MyObject(bar) {
  this.bar = bar;
}

MyObject.prototype.foo = function foo() {
  console.log(this.bar);
};

module.exports = MyObject;

// In another module:
var MyObjectOrSomeCleverName = require("./my_object.js");
var my_obj_instance = new MyObjectOrSomeCleverName("foobar");
my_obj_instance.foo(); // => "foobar"
对非构造函数的要求 对于非构造函数类函数也是如此:

// My Module
exports.someFunction = function someFunction(msg) {
  console.log(msg);
}

// In another module
var MyModule = require("./my_module.js");
MyModule.someFunction("foobar"); // => "foobar"

在我看来,node.js中的一些示例是精心设计的

你可能期望在现实世界中看到更多类似的东西

// square.js
function Square(width) {

  if (!(this instanceof Square)) {
    return new Square(width);
  }

  this.width = width;
};

Square.prototype.area = function area() {
  return Math.pow(this.width, 2);
};

module.exports = Square;
用法


为ES6人

class Square {
  constructor(width) {
    this.width = width;
  }
  area() {
    return Math.pow(this.width, 2);
  }
}

export default Square;
在ES6中使用它

import Square from "./square";
// ...
使用类时,必须使用
new
关键字来恢复它。其他一切保持不变。

示例代码如下:

大体上

square(width,function (data)
{
   console.log(data.squareVal);
});
使用以下方法可能有效

exports.square = function(width,callback)
{
     var aa = new Object();
     callback(aa.squareVal = width * width);    
}

最后,Node是关于Javascript的。JS有几种方法来完成一些事情,获得“构造函数”也是一样,重要的是返回一个函数

通过这种方式,实际上您正在创建一个新函数,例如我们在Web浏览器环境中使用JS创建的函数


就我个人而言,我更喜欢原型方法,正如Sukima在这篇文章中所建议的那样:

您的示例是一个语法错误。将
square
重命名为
square
后,
new square()
不再存在。对不起,这是一个打字错误。修好了。我的意图是显示以大写字母开头的对象/函数名和以小写字母开头的实例名。我也这么想,这就是为什么我这样写的原因。我只是想说,我真的很高兴其他人以同样的方式看待模块。我经常使用new关键字并组织模块以导出单个构造函数。我发现它使解决方案的可读性和概念化更容易。我一眼就能看出我打算使用哪种构造。像我一样思考的荣誉;)使用new关键字没有什么错。“我讨厌它周围所有的胡言乱语。”苏基玛同意-D我指出了为什么在这种情况下它不重要,并与另一个关于
的问题联系起来,这样其他人就可以在那里参与这场战争。结构异常简洁!因此,在您的问题中,我似乎已经找到并查找了,以防对其他人有所帮助:
import
export
在哪里定义?这些是ECMAScript 6(ES6)中的保留关键字。在ES6之前,必须使用库来管理模块。节点的模块化是按照CommonJS库的模块建模的。
导出默认方块
中的
默认
是什么?这指定了仅导入“文件”而不是从该文件导入其他特定导出时要导入的内容。只要它们存在,我就发现这些页面很有用:我能要求('./my object.js')(“foobar”)简称吗?或者需要不同用例的('module')(params)语法吗?没有什么可以阻止你,它只是JavaScript。是的,您可以使用较短的语法。关于如何定义模块的伪代码示例完全澄清了我对Node.js模块系统的理解。非常感谢。
square(width,function (data)
{
   console.log(data.squareVal);
});
exports.square = function(width,callback)
{
     var aa = new Object();
     callback(aa.squareVal = width * width);    
}