【发布时间】:2021-10-16 13:15:06
【问题描述】:
我认为我在方法链接方面缺少一些东西。对我来说感觉不完整。
方法链接的工作原理是让每个方法返回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 中的内置函数一样运行吗?
【问题讨论】:
-
字符串值没有方法;字符串原语被 String 实例隐式“装箱”,这与使用显式链接
this有效地做同样的事情 -
我知道他们没有方法,并且在这种情况下它们被转换为“字符串对象”(如果我没记错的话)。它只是作为一个例子来展示我想要通过方法链接实现的目标。
-
重点是,当遇到
.运算符时,会(至少在概念上)为每个字符串原始值创建新的 String 实例。当您拥有实际对象时不会发生这种情况,因此需要从旨在用于方法调用链中的方法返回this。 -
@Pointy 我知道这里需要返回
this进行链接。我只是不明白内置函数如何在链中的任何点都有返回值。例如 const array = [["hellow","pastas"],["travel", "militarie"],["oranges","mint"]]; const arrayOne = array.map(e1 => e1.filter(e2 => e2.length > 6)).flat(); array.map 有一个返回值,然后在链中用于过滤器,并再次被平面使用。此外,如果链减少并且您将其记录到控制台,则“this”对象不会被记录,而是一个结果。(我知道“this”正在实施......但这不是我们得到的) -
String.prototype.toUpperCase()返回一个字符串,一个原始值。随后的.运算符导致该字符串被隐式转换为new String 实例。这不是魔法,它只是表达式评估与.和原始值一起工作的方式。
标签: javascript method-chaining