节点模块和原型继承

时间:2015-11-24 18:21:25

标签: javascript node.js inheritance prototype

目前我有:

index.js(在模块foo中)

function Foo(options) {
    this.memberVar = options.memberVar;
}

Foo.prototype.bar = function(word) {
    console.log('word: ', word);
}

module.exports = Foo;

server.js(在单独的模块栏中)

var Foo = require('foo'),
    foo = new Foo(options),
    greeting = 'Hello World!';

foo.bar(greeting); // prints Hello World!

这很好,除了我觉得如果我没有必要使用new关键字来实例化一个新的foo对象来公开其成员函数,我觉得它可以更漂亮,更容易理解。

所以我希望能够做到这一点:

var greeting = 'Hello World!',
    foo = require('foo')(options);
foo.bar(greeting); // prints Hello World!

如何修改我当前的foo-index.js,以便能够访问Foo对象,如上面的代码片段所述?

1 个答案:

答案 0 :(得分:1)

如果您不希望模块的使用者使用new,您可以公开工厂方法:

// index.js (in module foo)

function Foo(options) {
    this.memberVar = options.memberVar;
}

Foo.prototype.bar = function(word) {
    console.log('word: ', word);
}

module.exports = function(options) {
    return new Foo(options);
}


// server.js (in separate module bar) 

var greeting = 'Hello World!',
    foo = require('foo')(options);
foo.bar(greeting); // prints Hello World!

但请注意,极大会使您模块的用户感到困惑。您的原始模式被广泛接受,是公开构造函数的首选方式。