将对象称为函数?

时间:2017-03-27 09:19:04

标签: javascript

可能我正在重新发明一个轮子,但我正在尝试为自己创建一个漂亮的记录器并着色。

我的想法是能够require来自我的组件的这个记录器,并且不要求它传递给它一些名称,这样如果我从组件调用记录器,它将输出该组件的名称(或者我传给它的任何文字)。

所以我的模块看起来像这样:

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个不同的组件中实例化这个记录器时,我们不会污染内存。 / p>

如果我像这样使用它,效果很好:

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或输出如果我在实例化后只是将字符串传递给它,则为白色。

我觉得应该有一个黑客去做。

1 个答案:

答案 0 :(得分:0)

函数是具有特殊内部标记[[call]]的对象,这意味着它们可以作为函数调用。

在JavaScript中将方法分配到函数上是完全可以接受的,并且它是经常使用的模式。