2017-05-21 4 views
1

私は、連鎖したメソッドで提供された値を比較した後、ex1とex2の関数を連鎖してtrueまたはfalseを表示しようとしていました。JavaScriptのメソッドチェーニングの比較

function test() { 
    var ex1 = function(parm) { 
     return this; 
    } 

    var ex2 = function(par) { 
     return this; 
    } 

    var result = function() { 
     console.log('compare and display a boolean result '+ex1(parm).ex2(par)); 
    } 
}; 
var res = test(); 
res.ex1('Sam').ex2('Eddie').result(); 

ご協力いただきありがとうございます。

+4

あなたは質問をするのを忘れていました。 –

+0

どのように比較して結果を表示するのですか? – dab

+0

比較する値は2つだけですか? –

答えて

4

あなたはこれを行うことができます。CEDにより示唆されるようにグローバルな名前空間を汚染しないように

function Test() { 
 
    this.ex1 = function(parm) { 
 
    this.param1 = parm; 
 
    return this; 
 
    } 
 

 
    this.ex2 = function(par) { 
 
    this.param2 = par; 
 
    return this; 
 
    } 
 

 
    this.result = function() { 
 

 
    console.log('compare and display a boolean result ' + (this.param1 == this.param2)); 
 
    } 
 
    //return this; 
 
}; 
 
var res = new Test(); 
 
res.ex1('Sam').ex2('Sam').result();
は私の答えを編集しました。また、このルートに行く場合は、コンストラクタ関数内からプロトタイプオブジェクト Testにメソッドを移動します。したがって、例としてex1は次のように書かれなければならない。

Test.prototype.ex1 = function(parm) { 
       this.parm = parm; 
       return this; 
      } 

他の方法も同じです。

+0

私はこれをやっていないことをお勧めしたいと思います。あなたの関数を呼び出すとき、これはウィンドウを指し示します。 – Ced

+0

私は将来の読者の利益のためにあなたのポイントを組み込むために私の答えを編集するつもりです。 –

+0

ありがとう、私はダウンボートを削除しようとしましたが、5分後にはできません。申し訳ありません – Ced

0

あなたがオブジェクトリテラルを使用しており、これを読みやすくすることができます

var Test = { 
 
    that: function(param) { 
 
     this.param1 = param; 
 
     return this; 
 
    }, 
 
    isEqualTo: function(param) { 
 
     this.param2 = param; 
 
     return this.param1 === this.param2; 
 
    } 
 
}; 
 

 
console.log(Test.that('abc').isEqualTo('cba')); // false 
 
console.log(Test.that('123').isEqualTo('321')); // false 
 
console.log(Test.that('asd').isEqualTo('asd')); // true 
 
console.log(Test.that('tre').isEqualTo('tre')); // true 
 

 
// or just reusing 
 

 
Test.that('word'); 
 
console.log(Test.isEqualTo('drow')); // false 
 
console.log(Test.isEqualTo('world')); // false 
 
console.log(Test.isEqualTo('word')); // true

0
function test() { 
    var ex1 = function(parm) { 
     return this; 
    } 

    var ex2 = function(par) { 
     return this; 
    } 

    var result = function() { 
     console.log('compare and display a boolean result '+ex1(parm).ex2(par)); 
    } 
}; 

これが実行されるときに、それは何も返しません。したがって

var res = Test(); 

解像度定義されていません。したがって、ex1は定義によって未定義に存在しません。

res.ex1('Sam').ex2('Eddie').result(); 

私の答えは、これを返すことです。 Do notこれを行う。

function test() { 
    this.ex1 = function(parm) { 
    this.param1 = parm; 
    return this; 
    } 

    this.ex2 = function(par) { 
    this.param2 = par; 
    return this; 
    } 

    this.result = function() { 

    console.log('compare and display a boolean result ' + (this.param1 == this.param2)); 
    } 
    return this; 
}; 

thisと入力すると、ウィンドウと同じになります。したがって、あなたはウィンドウオブジェクトを汚染しています。あなたの代わりに何ができるか

function Test() { 
    this.parm; 
    this.par; 
    this.ex1 = function(parm) { 
     this.parm = parm; 
     return this; 
    } 

    this.ex2 = function(par) { 
     this.par = par; 

     return this; 
    } 

    this.result = function() { 
     console.log('compare and display a boolean result '+ (this.parm === this.par)); 
    } 
}; 
var res = new Test(); 

res.ex1('Sam').ex2('Eddie').result(); 

あなたは新しいテスト(コール):新しいオブジェクトは、それに{}ところ、この値ポイントを作成しています。その後、関数が実行されます。したがって、オブジェクトには関数が含まれていて、ウィンドウが汚染されることはありません。

+0

グローバルな名前空間を汚染しないことについての良い点。しかし、OPはこれまでのところ解決策が彼の直面する問題を解決することであった。ちなみに、 'constructor'関数のルートに行くなら、' test'の名前を 'Test'に変更することをお勧めします。 –

+0

@PankajShukla私は実際に彼はユースケースを持っていないと思う...あなたがこの種の機能をしているなら、それは学習目的のためだと賭けている。それ以外の場合は '==='を使用します。それが学習目的のためのものなら、私は、彼に何が起こっているのかを少し説明する方が良いと思う。 – Ced

+0

さらに、OPがコンストラクタ関数ルートになると、コンストラクタ内からTestのプロトタイプオブジェクトにメソッドを移動する必要もあります。コンストラクタ関数内でメソッドをアタッチするのは適切な方法ではありません。 –

0

関数が内部にあるオブジェクトを返すことができ、内部関数が呼び出された場合は、呼び出すための別の関数を使用せずに結果を返します。resultの明示的な呼び出しで上記を使用するための

function test(value1) { 
 
    return { 
 
     equals: function (value2) { 
 
      return value1 === value2; 
 
     } 
 
    }; 
 
} 
 

 
console.log(test(1).equals(1)); 
 
console.log(test(1).equals(2));

、あなたは

function test(value1) { 
 
    return { 
 
     equals: function (value2) { 
 
      return { 
 
       result: function() { 
 
        return value1 === value2; 
 
       } 
 
      }; 
 
     } 
 
    }; 
 
} 
 

 
console.log(test(1).equals(1).result()); 
 
console.log(test(1).equals(2).result());

のように、リターンオブジェクトで結果プロパティを追加することができます上記のものとほぼ同じです。ネクタイ

function test(value1) { 
 
    var v2, 
 
     object = { 
 
     equals: function (value2) { 
 
      v2 = value2; 
 
      return object; 
 
     }, 
 
     result: function() { 
 
      return value1 === v2; 
 
     } 
 
    }; 
 
    return object; 
 
} 
 

 
console.log(test(1).equals(1).result()); 
 
console.log(test(1).equals(2).result());