1

我不明白 Chalk 的(NodeJS 模块)语法是如何工作的(这让我很困扰)。我已经广泛搜索了答案,但我没有任何运气,并且可能不知道我需要寻找的技术术语。我尝试在 StackOverflow、“方法链”、“原型”等上查找特定于粉笔的问题。尝试查看粉笔的源代码,但似乎仍然无法弄清楚我的答案。有问题的语法是:

// Code snippet from the Chalk NPM Page.
log(chalk.blue.bgRed.bold('Hello world!'));
log(chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz'));

我熟悉方法链接,也熟悉将函数存储在对象中。我的主要问题是:如何同时chalk.blue成为属性和函数?

任何帮助将不胜感激。无论是完整的解释还是朝着正确的方向推进。

4

2 回答 2

1

我的主要问题是:如何同时chalk.blue成为属性和函数?

在 Javascript 中,函数是一个对象,因此除了可以调用 as 之外chalk.blue(),它还可以具有诸如chalk.blue.bgRed.

例如,您可以这样做:

function callMe() {
    console.log("callMe");    
}

callMe.greeting = "hello";

callMe();
console.log(callMe.greeting);

然后,对于无限链接,您可以使用getters创建无限的对象链。

于 2021-07-15T04:43:53.133 回答
1

Chalk 可能正在使用gettersetter来“调用”适当的函数。以下是正在发生的事情的一个简单示例:

let a = function (txt) {
    console.log(a.buffer + txt);
    a.buffer = ''
}

a.buffer = '';

Object.defineProperty(a,'b',{
    get: function(){
        this.buffer += '<B>';
        return this
    }
});

Object.defineProperty(a,'c',{
    get: function(){
        this.buffer += '<C>';
        return this
    }
});

Object.defineProperty(a,'d',{
    get: function(){
        this.buffer += '<D>';
        return this
    }
});

基本上它只是常规的方法链接,但使用getter让它变得花哨!另一个技巧是使基础对象成为 Function 而不是常规对象,以便this您返回的成为可调用对象。

现在你可以这样做:

a.b.c.b.d('hello'); // prints <B><C><B><D>hello
于 2021-07-15T04:46:58.007 回答