Javascript模块:原型与导出

时间:2014-02-21 16:17:25

标签: javascript node.js module prototype

我是node.js(和stackoverflow)的新手,并没有找到对此的确切解释。

这可能是一个试验性的答案,但希望它能帮助那些也从Python /其他面向对象框架过渡的人。

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

我正在研究Ghost CMS,他们同时使用它们。我似乎无法找出为什么他们会在某些情况下选择一个而不是另一个。

任何帮助都表示赞赏,即使它指向其他链接。

2 个答案:

答案 0 :(得分:11)

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

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。

答案 1 :(得分:6)

使用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) { ... });
另一方面,

Prototypes(一个普通的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();

干杯。