我创建了一个支持链接的类,使用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可以帮助我实现这个目标吗?
答案 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方法,但返回一个字符串对象,然后您只能调用字符串方法。所以,你可以做一些你返回不同类型对象的东西。