微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

NodeJS 模块 Chalk 的链接语法如何工作?

如何解决NodeJS 模块 Chalk 的链接语法如何工作?

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

// 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 怎么能同时是一个属性一个函数

我们将非常感谢任何帮助。无论是完整的解释还是朝着正确的方向推动。

解决方法

我的主要问题是:chalk.blue 怎么能同时是一个属性和一个函数?

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

例如,您可以这样做:

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

callMe.greeting = "hello";

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

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

,

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

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
    }
});

基本上它只是常规的方法链,但使用 getters 使它更漂亮!另一个技巧是使基础对象成为函数而不是常规对象,以便您返回的 this 成为可调用的。

现在你可以:

a.b.c.b.d('hello'); // prints <B><C><B><D>hello

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。