Javascript 将对象作为函数调用?

Javascript 将对象作为函数调用?,javascript,Javascript,也许我正在重新发明一个轮子,但我正试图用颜色为自己创造一个好的记录器 这个想法是能够从我的组件中要求这个记录器,并且upont要求它传递一些名称,这样,如果我从组件调用记录器,它将输出这个组件的名称(或者我传递给它的任何文本) 因此,我的模块如下所示: var chalk = require("chalk"); var JustLogger = function(name) { this.name = name; }; // message types JustLogger.proto

也许我正在重新发明一个轮子,但我正试图用颜色为自己创造一个好的记录器

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

因此,我的模块如下所示:

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;
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对象,并提供了一些原型来帮助它-这样,当我们在10个不同的组件中实例化这个logger时,我们就不会污染内存

如果我这样使用的话,效果非常好:

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;
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
,但它应该只执行一个简单的
控制台。log
或白色输出,如果我在实例化后向其传递一个字符串


我觉得应该有一个黑客来做这件事。

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


在JavaScript中,将方法分配给函数是完全可以接受的,这是一种经常使用的模式。

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


在JavaScript中,将方法分配给函数是完全可以接受的,这是一种经常使用的模式。

您可以返回一个函数并将新的“方法”分配给函数对象。函数可以有属性。只要
logger
是一个函数,它就可以正常工作。也许这会有帮助:您可以返回一个函数,并在函数是对象时分配新的“方法”。函数可以有属性。只要
logger
是一个函数,它就可以正常工作。也许这会有帮助:那么在我的情况下,我应该向我的记录器代码添加什么,以便在实例化后能够使用
logger(“blablablabla”)
?那么在我的情况下,我应该向记录器代码添加什么,以便能够使用
logger(“blablabla”)
实例化之后?