JavaScript 模块:原型 vs. 导出

11

我刚接触node.js(以及stackoverflow),没有找到确切的解释。

这可能只是一份试探性答案,但希望它能帮助其他正在从Python/其他面向对象框架过渡的人。

我看过其他关于js中原型概念的文章,还有一些解释node.js的module.exports。

我正在研究Ghost CMS,他们两者都在使用。我似乎无法分辨在某些情况下为什么要选择其中之一。

任何帮助都将不胜感激,即使只是指向其他链接。


3
他们两者没有任何关系。module.exports 用于导入其他模块;原型是用于创建实例的。 - SLaks
1
感谢SLaks,我只是认为既然可以通过module.function访问模块元素,那么它与原型类似,因为你可以以相同的方式访问已具有原型的属性。 - elloworld111
2个回答

20

实际上它们在某种程度上是可以互换的:

使用prototype

//module.js
function Person (name) {
  this.name = name;
}

Person.prototype.sayName = function () {
  console.log(this.name);
}

module.exports = Person;

//index.js
var Person = require('./module.js');
var person = new Person('John');

person.sayName();

使用 exports

//module.js
exports.init = function (name) {
  this.name = name;
  return this;
}

exports.sayName = function () {
  console.log(this.name);
}

//index.js
var Person = require('./module.js');
var person = Object.create(Person).init('John');

person.sayName();

第一个例子更符合JavaScript的惯用语言,尽管如此。

4
它们并不完全可以互换。与对象原型进行交互和与(模块)对象的导出属性进行交互具有非常不同的典型用例。将它们视为可互换的最多是误导性的,可能会有害。JavaScript开发人员应该真正理解这种区别。 - heyheyjp
谢谢您的回答,不过我还在寻找更具体的内容。多亏了您,我已经开始在适当的地方使用原型了。 - elloworld111
1
@prattsj,“exports”和“prototype”是您所解释的两个完全不同的东西。我只是想展示它们可以用来做相同的事情的方式。这不是针对这个特定问题的最佳答案,只是一个补充。 - vkurchatkin

10

使用Node.js时,module.exports是公开模块接口的方法。

/* my-module.js */

exports.coolFunction = function(callback) {

    // stuff & things
    callback(whatever);
};

在导入/要求它之后,另一个模块可以消费此接口:

/* another-module.js */

var myModule = require('my-module');

myModule.coolFunction(function(error) { ... });

原型(JavaScript 中的一个普通特性),则可用于定义从构造函数实例化出来的对象所共享的属性和方法。

function User() {
    this.name = null;
}

User.prototype.printGreeting = function() {
    console.log('Hello. My name is: ' + this.name);
};

var user = new User();
user.name = 'Jill';

user.printGreeting();

干杯。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接