2015-11-24 67 views
1

目前我有:节点模块和原型继承

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! 

如何修改我的当前富 - index.js能够访问Foo对象,如上面的代码段描述的?

+1

你的例子可能是歪曲你的意图,因为它不使用OOP提供的上下文。如果你所有的模块都提供了不需要(每个实例可变)上下文的功能,那么就不需要追踪OOP。 –

+0

是的,我同意我不需要在这个例子中的OOP,但这不是我的实际使用情况,只是一些快速的垃圾。 – Skam

回答

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! 

请注意,但是,比它可能大大迷惑你的模块的用户。您的原始图案是广泛接受并且是暴露构造函数的首选方法。