메서드 체인은 일반적으로 객체에 대한 연속 작업에 적합합니다(한 줄의 코드에 집중). 어느 정도 코드량을 줄일 수는 있지만, 함수의 반환 값을 차지한다는 단점이 있습니다.
1. 객체 체인: 메소드 본문이 객체 인스턴스 자체를 반환합니다(this)
view sourceprint?01 function ClassA(){
02 this.prop1 = null;
03 this.prop2 = null;
04 this.prop3 = null
06 ClassA.prototype = {
07 method1 : function(p1){
08 this.prop1 = p1;
09 return this; >
11 method2 : function(p2){ 12 this.prop2 = p2; 13 return this; 15 method3 : function(p3){ 16 this.prop3 = p3; 17 return this 18 } 19 }함수/클래스 ClassA가 정의되어 있습니다. 세 가지 속성/필드 prop1, prop2, prop3이 있고 세 가지 메서드 method1, method2, method3이 각각 prop1, prop2, prop3을 설정합니다.
호출은 다음과 같습니다.
view sourceprint?1 var obj = new ClassA()
2 obj.method1(1).method2(2).method(3) ; // obj -> prop1=1,prop2=2,prop3=3
ClassA의 N개의 메소드가 연속으로 실행되는 것을 볼 수 있습니다. 이런 방식으로 정의되면 호출 체인은 계속됩니다.
이 메서드의 단점은 체인 메서드가 하나의 개체 유형(ClaaaA)에 고유하게 바인딩된다는 것입니다. 이러한 방식으로 체인 작업을 구현하려면 클래스가 정의될 때마다 해당 메서드 본문에 이를 반환해야 합니다. . 두 번째 방법으로 이 문제를 해결할 수 있습니다.
2. 함수 체인: 객체가 전달된 후 각 호출은 함수 자체를 반환합니다.
view sourceprint?01 /**
28 }, 29 method3 : function(p3){ 30 this.prop3 = p3 31 } 32 }
ClassB의 method1, method2, method3에서는 더 이상 반환되지 않습니다.
호출은 다음과 같습니다.
view sourceprint?1 var obj = new ClassB()
2 chain(obj)(method1,4)(method2,5)(method3 ,6) ; // obj -> prop1=4,prop2=5,prop3=6
첫 번째 메서드는 세 번의 호출 후에 객체 자체를 반환합니다. 여기서는 빈 "()"가 사용됩니다. 그것을 검색하려면 Objectview sourceprint?1 // result -> prop1=4,prop2=5,prop3=6
2 var result = chain(obj)(method1,4) (method2, 5)(method3,6)();
이런 방식으로 클래스를 작성하면 메서드 본문에서 이를 반환할 필요가 없으며 어떤 객체에 대해서도 체인 호출이 가능합니다.
두 가지 호출 방법:
view sourceprint?01 obj
04 .method3(arg3) 05 ... 06 07 chain(obj) 08 (method1,arg1)
09(메소드2,arg2) 10(메소드3,arg3) 11 ...