2017-03-27 17 views
1

おそらく、私は車輪を再発明していますが、私は着色のために素敵なロガーを自分で作成しようとしています。オブジェクトを関数として呼び出しますか?

アイデアは、このロガーを私のコンポーネントから得ることができるようにすることです。そして、私は、コンポーネントからロガーを呼び出すと、私はそれを渡すテキスト)。

だから私のモジュールは次のようになります。

var chalk = require("chalk"); 

var JustLogger = function(name) { 
    this.name = name; 
}; 

// message types 
JustLogger.prototype.error = function() { 
    return console.log(this.greet(chalk.red) + chalk.red.apply(null, arguments)); 
}; 

JustLogger.prototype.info = function() { 
    return console.log(this.greet(chalk.cyan) + chalk.cyan.apply(null, arguments)); 
}; 

// coloring 
JustLogger.prototype.green = function() { 
    return chalk.green.apply(this, arguments); 
}; 

// utility 
JustLogger.prototype.greet = function(f) { 
    return f(chalk.bold("[" + this.name["0"] + "]: ")); 
}; 

const _instance = function(){ 
    return new JustLogger(arguments); 
}; 
module.exports = _instance; 

だから作成したロガーオブジェクトがあります、そして同様に試作品のカップルはそれを支援するために - 私たちはインスタンス化しますとき、そのように、我々はメモリを汚染しません。このロガーは10種類のコンポーネントで構成されています。

それは私がこのようにそれを使用する場合は、単に素晴らしい作品:

var logger = require(path_to_just_logger)("some name"); 
logger.error("this is an error message"); // outputs in red [some name]: this is an error message 
logger.info("this is an info message"); // outputs in cyan [some name]: this is an info message 

しかし、同様にこれを行うことが可能になるようにそれを作るすることが可能です:

var logger = require(path_to_just_logger)("some name"); 
logger.error("this is an error message"); // outputs in red [some name]: this is an error message 
logger.info("this is an info message"); // outputs in cyan [some name]: this is an info message 
logger("this is default message"); // should output `[some name]:this is default message` with no colors 

ここでは、適切なメソッドを呼び出すことによって.errorまたは.infoのような特別なタイプのメッセージを出力することができますが、インスタンシエーション後に文字列を渡すだけで簡単にconsole.logを出力する必要があります。

私はそれを行うためにハックする必要があると感じています。

+0

関数を返し、それらに新しい 'メソッド'を割り当てることができます – alex

+0

関数はオブジェクトです。関数はプロパティを持つことができます。 'logger'が関数である限り、これは正常に動作します。 – deceze

+0

これはおそらく助けになるかもしれません:http://stackoverflow.com/questions/10341127/can-javascript-constructor-return-function-and-keep-inheritance –

答えて

0

関数は、特別な内部タグ[[call]]を持つオブジェクトです。つまり、関数として呼び出すことができます。

JavaScriptを使用すると、メソッドを関数に割り当てることができます。よく使用されるパターンです。

+0

私のケースでは、私は私のロガーコードに何を追加すればいいですか?インスタンス化の後に 'logger(" blablabla ")'を使用できるようにするには? – kaytrance

関連する問題