gpt4 book ai didi

javascript - 方法链可以像 Javascript 中内置函数的实现方式那样实现吗?

转载 作者:行者123 更新时间:2023-12-04 14:02:21 25 4
gpt4 key购买 nike

我认为我在方法链接方面缺少一些东西。对我来说感觉不完整。
方法链的工作原理是让每个方法返回 this以便可以调用该对象的另一个方法。然而,返回值为 this 的事实而不是函数的结果对我来说似乎不方便。
这是一个简单的例子。

const Obj = {
result: 0,
addNumber: function (a, b) {
this.result = a + b;
return this;
},

multiplyNumber: function (a) {
this.result = this.result * a;
return this;
},
}

const operation = Obj.addNumber(10, 20).multiplyNumber(10).result
console.log(operation)
重点:
  • 链中的每个方法Obj.addNumber(10, 20).multiplyNumber(10)返回 this .
  • 链的最后一部分.result是返回 this 以外的值的值.

  • 这种方法的问题在于,它要求您附加一个属性/方法以在末尾获得一个值而不是 this。 .
    将此与 JavaScript 中的内置函数进行比较。
    const str = "  SomE RandoM StRIng  "

    console.log(str.toUpperCase()) // " SOME RANDOM STRING "
    console.log(str.toUpperCase().trim()) // "SOME RANDOM STRING"
    console.log(str.toUpperCase().trim().length) // 18
    重点:
  • 链中的每个函数都返回函数的结果不是 this (也许这是在幕后完成的)
  • 在链的末尾不需要任何属性/方法来获得结果。

  • 我们可以实现方法链来表现 Javascript 中内置函数的行为方式吗?

    最佳答案

    首先,您的每个 console.log 都没有正确返回:

    console.log(str.toUpperCase.trim) //undefined
    它返回 undefined 因为 str.toUpperCase 返回函数对象并且不执行函数本身所以它不会工作
    唯一正确的用法是
    console.log(str.toUpperCase().trim()
    现在关于您的问题,在没有结果的情况下很容易做到,而且效率更高。
    javascript 中的所有内容都有一个名为 valueOf() 的方法,这是我为数字调用类似的所有内容的示例,尽管我更喜欢只创建函数而不是对象。

    const Obj = {
    addNumber: function (a = 0) {
    return a + this.valueOf();
    },

    multiplyNumber: function (a = 1) {
    return a*this.valueOf();
    },
    }
    const nr = 2;
    Object.keys(Obj).forEach(method => {
    Number.prototype[method] = Obj[method];
    })
    console.log(Number.prototype); // will print out addNumber and multiplyNumber
    // Now You can call it like this
    console.log(nr.addNumber().multiplyNumber()); // Prints out 2 because it becomes (nr+0)*1
    console.log(nr.addNumber(3).multiplyNumber(2)) // Prints out 10;

    关于javascript - 方法链可以像 Javascript 中内置函数的实现方式那样实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69595934/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com