定义哪个方法可以链接

时间:2017-01-11 22:42:47

标签: javascript node.js prototype chaining

我创建了一个支持链接的类,使用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()。有lib可以帮助我实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

您在Javascript中无法提出要求。当你这样做时:

return this;

在您的方法中,您将返回相同的对象。可以在返回的对象上调用任何公共方法,并且无法指定,因为对象是从方法返回的,它应该以某种方式不允许调用某些方法。

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

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

和此:

obj.method1().ar_2();

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

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

因此,如果temp与您obj return this时的method1()相同,则obj.method1().ar_2();与{obj.method1(); obj.ar_2();相同1}}(打字少一点)。因此,您无法阻止调用.ar_2()

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

现在,您可以让obj.method1()返回不同的对象。如果你这样做,那么那个不同的对象就可以有不同的方法,并且可以是一个没有.ar_2()方法的对象。

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

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

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

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

这里,.join()是一个Array方法,但返回一个字符串对象,然后您只能调用字符串方法。所以,你可以做一些你返回不同类型对象的东西。