2015-11-24 101 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! 

請注意,但是,比它可能大大迷惑你的模塊的用戶。您的原始圖案是廣泛接受並且是暴露構造函數的首選方法。