ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScriptにおける連鎖呼び出しに関する研究

JavaScriptにおける連鎖呼び出しに関する研究

高洛峰
高洛峰オリジナル
2016-11-25 10:54:36943ブラウズ

メソッドチェーンは一般に、オブジェクトに対する連続操作 (1 行のコードに集中) に適しています。コード量はある程度削減できますが、関数の戻り値を占有してしまうのがデメリットです。

1. オブジェクトチェーン: メソッド本体はオブジェクトインスタンスそのもの (this) を返します。

04 this.prop3 = null;

05 }

06 ClassA.prototype = {

07 method1 : function(p1){

08 this.prop1 = p1;

10 },

11 メソッド 2: function(p2){

12 this.prop2 = p2;

13 return this;

14 },

15 メソッド 3: function(p3){

16 This.prop3 = p3;

17 return this;

18 }

19 }

は関数/クラス ClassA を定義します。 prop1、prop2、prop3 という 3 つの属性/フィールドがあり、3 つのメソッド method1、method2、method3 がそれぞれ prop1、prop2、prop3 を設定します。

呼び出しは次のとおりです:

view sourceprint?1 var obj = new ClassA();

2 obj.method1(1).method2(2).method(3); // obj -> ,prop2= 2, prop3=3

このように、ClassAのN個のメソッドが定義されている限り、objが連続して操作されていることがわかります。

このメソッドの欠点は、チェーン メソッドが 1 つのオブジェクト タイプ (ClaaaA) に一意にバインドされることです。この方法でチェーン操作を実装するには、クラスが定義されるたびに、これをメソッド本体で返す必要があります。 2 番目の方法でこの問題を解決できます。

2. 関数チェーン: オブジェクトが渡された後、各呼び出しは関数自体を返します

view sourceprint?01 /**


02 * チェーンライトバージョン

03 * @param {Object} obj

04*/

05 functionchain(obj){

06 return function (){

07 var Self = argument.callee; Self.obj = obj;

08 if(arguments.length==0){

09 return Self.obj }

11 Self.obj [arguments[ 0]].Apply (Self.obj, [].Slice.call (ARGUMENTS, 1)); = null;

20 this.prop3 = null;

22 ClassB.prototype = {

23 メソッド1 : function(p1){

24 this.prop1 = p1; 26 メソッド 2 : function(p2){

27 this.prop2 = p2 }、

29 メソッド 3 : function(p3){

30 this.prop3 = p3 }

32 }

これは ClassB のメソッド 1、メソッド 2、およびメソッド 3 では返されなくなったことに注意してください。

呼び出しは次のとおりです:

view sourceprint?1 var obj = new ClassB();

2chain(obj)(method1,4)(method2,5)(method3,6); // obj -> prop1=4 ,prop2=5,prop3=6

最初のメソッドは、3 回の呼び出し後にオブジェクト自体を返します。ここでは、空の "()" を使用してオブジェクトを取得します

view sourceprint?1 // result -> ; prop1=4 ,prop2=5,prop3=6

2 var result =chain(obj)(method1,4)(method2,5)(method3,6)();

このようにクラスを書くと、メソッド body でこれを返す必要はなく、任意のオブジェクトに対してチェーン呼び出しを行うことができます。

2 つの呼び出しメソッド:

view sourceprint?01 obj

02 .method1(arg1)

03 .method2(arg2)

04 .method3(arg3)

05 ...

06

07 チェーン(obj)

08 (method1,arg1)

09 (method2,arg2)

10 (method3,arg3)

11 ...

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。