定义可以链接的方法

Defining which method can be chained

我创建了一个 class,它通过使用 return this; 支持链接,并且 现在我需要让当前方法告诉哪些方法可以链接。示例:

class MyClass {
  constructor(path) {
    this.path = path;
  }

  method1() {
    // some code here...
    // i must make something here to only allow channing if it's method
    // blabliblu
    return this;
  }

  blabliblu() {
    // some code here...
    // same thing here, if the channing is with the method ar_2, it's ok.
    return this;
  }

  ar_2() {
    // And so on...
    return this;
  }
}

所以,我可以做到:method1().blabliblu(),但我做不到method1().ar_2()。有没有库可以帮我实现这个?

您所要求的内容在 Javascript 中是不可能的。当你这样做时:

return this;

在您的方法中,您 return 使用的是同一个对象。任何 public 方法都可以在 returned 的对象上调用,并且无法指定,因为该对象是 returned 从一个方法它应该以某种方式不允许某些方法被调用。

因此,使用您示例中的代码,其中您在 .method1()return this,这之间没有区别:

obj.method1();
obj.ar_2();

还有这个:

obj.method1().ar_2();

那是因为链式版本本质上是 JS 解释器内部的:

let temp = obj.method1();
temp.ar_2();

因此,如果 tempobj 相同,当您从 method1()return this 时,则 obj.method1().ar_2();obj.method1(); obj.ar_2();(少打字)。因此,您无法阻止调用 .ar_2().

两者都只是在同一个对象上调用 .method1().ar_2()。所以你不能阻止一种方案,但允许另一种方案。 ar_2 要么是 public 方法,要么不是。您不能在同一个对象上让它在一个地方可调用而在另一个地方不可调用。


现在,您可以将 obj.method1() return 设为不同的对象。如果你这样做了,那么那个不同的对象可能有不同的方法,并且可能是一个没有 .ar_2() 方法的对象。

当您像这样链接数组方法时:

let result = [1,2,3].map(...).filter(...);

该链中的每一步都在 returning 一个不同的对象(他们不是在做 return this,而是在创建一个新对象并 returning 它。在这个特定的数组示例,这些是 returning 不同的对象,但类型相同,但您可以 return 不同类型的不同对象。例如:

let result = ["a","b","c"].join("").toUpperCase();

这里,.join()是一个数组方法,但是return是一个字符串对象,你只能调用它的字符串方法。所以,你可以做类似的事情,你 return 不同类型的对象。