13

編集
これは、私の質問をより簡単にするための試みです。

return this.someFunc(); == return { XXX:this.someFunc() };

このステートメントを真実にするために、XXX に何を入力する必要がありますか?


チェーンできる関数を作成しようとしています。いくつかの仮想コードを書きましょう。(構文エラーはすべて無視します。私はこれをすばやく入力していますが、これは単なる概念コードです。) すべての関数がローカルまたはグローバルに定義されていると仮定します。:)

test = function(){
  this.someFunc = function(){
    this.retest = function(){
      //...code
    }
    //...code
  }
  this.someFunc2 = function(){
    //...code
  }
  return this.someFunc();
}

この関数を使用すると、連鎖できます。test().retest();
しかし、私がやりたいのは、複数のアイテムを返すことです。

test = function(){
  this.someFunc = function(){
    this.retest = function(){
      //...code
    }
    //...code
  }
  this.someFunc2 = function(){
    //...code
  }
  return { XXX:this.someFunc(), //What do I put for XXX
           next:this };
}

test() が提供する別の関数にアクセスするためにこれを行いたい:test().next.someFunc2();

だから私の問題はこれです:
私はまだこのようにチェーンできるようにしたい:test().retest();
しかし、私はこのようにしなければなりません:test().XXX.retest();

私のコードでは、これを達成するために XXX の代わりに付けることができる名前は何ですか? そして、これは可能ですか?私はすでに試し0ましdefaultた。助けてくれてありがとう。

4

8 に答える 8

16

次のような連鎖可能な関数を作成できます。

var test = function(){

    var self = {};
    console.log('test called')

    function someFunc() {
        console.log('someFunc')
        return self;
    }

    function someOtherFunc() {
        console.log('someOtherFunc')
        return self;
    }   

    self.someFunc = someFunc;
    self.someOtherFunc = someOtherFunc;
    return self;

}

test().someFunc().someOtherFunc();

お役に立てれば

于 2012-08-21T23:04:25.433 に答える
3
function test() {
   // when test() is called as a regular function
   // it's `this` will be `undefined` (in strict mode) or will refer to a global object
   // when test() is called with `new` operator
   // it's `this` will be an instance of `test` object
   if(!(this instanceof test)) {
      // create a new object
      return new test();
   }
   else {
      // this is a `new object` creation              
      console.log('new Test created');
   }
}

// declare functions which will be accessible on test object
test.prototype.someFunc = function() {
    console.log('someFunc');
    return this;
};

test.prototype.someFunc2 = function() {
    console.log('someFunc2');
    return this;
};

// declare a `chaining` function - will create a new `test` object
test.prototype.test = function() {
    return new test(); // new instance will be created
};

このコードを使用すると、次のコードを実行できるようになります

test().someFunc().someFunc2().test().someFunc().someFunc().test().test()

次の文字列がコンソールに書き込まれます

new Test created
someFunc
someFunc2
new Test created
someFunc
someFunc
new Test created
new Test created
于 2012-09-04T07:31:13.070 に答える
1

スコープに問題があります。関数内で_NAME "test" を参照できません。関数がどのように呼び出されるかがわからないためです。

静的に行う場合は、次のことができます。

test = function(){

    this.someFunc = function(){ // blaaa
    };

    //...code 
    return { 
        OUTPUT: this.someFunc(), //What do I put for XXX
        test: this
    };
}

結果は次のようになります。

test().test().test().test().OUTPUT (or something like this)
于 2012-08-30T16:21:19.997 に答える
1

わかりましたので、私はあなたの質問を理解していると思いますが、よくわかりません (そして、ここは非常に夜遅いので、それについてはいくらか信用してください)。次のような動作が必要だと思います。

test(); //is ["result1"]
test().retest(); //is ["result1", "result2"]
test().retest().retest(); //is ["result1", "result2", "result3"]

文字列の代わりにオブジェクトを返したいと思うかもしれませんが、それは同じ一般的な考え方です。コードは非常に単純であることがわかります。

var test = (function() {
    var results = ["result1"], 
        i = 1;

    results.retest = (function() {
        results.push("result" + (++i));
        return results;
    });

    return results;
});

test(); //is ["result1"]
test().retest(); //is ["result1", "result2"]
test().retest().retest(); //is ["result1", "result2", "result3"]

それがあなたが探しているものかどうかはわかりませんが、おそらく正しい軌道に乗ることができます.

于 2012-09-06T06:55:48.057 に答える
0

あなたの例はあなたが投稿したようには機能しないので、私はあなたが次のことを意味したと思います:

test = function(){
  this.someFunc = function(){
    this.retest = function(){
      //...code
    }
    //...code
  }
  this.someFunc2 = function(){
    //...code
  }
  return new this.someFunc();
}

見返りに新しいものに注意してください。さて、関数をチェーンできるようにするには、これを返す必要があります。

return {retest: new this.someFunc().retest, next:this};

そうすることで、電話をかけることができますtest().retest(); 。これがお役に立てば幸いです。

于 2012-09-06T10:14:14.940 に答える
0

これを行う

test = function(){
  this.someFunc = function(){
    this.retest = function(){
      //...code
    }
    //...code
  }
  this.someFunc2 = function(){
    //...code
  }

  var ret = this.somefunc();
  ret.next = this;

  return ret;
}

編集:これは、より優れた機能するバージョンです

test = function(){
  var ret;

  var func = function() {
    console.log("test func");
  }

  ret = function(){
    func();
    return ret;
  }

  ret.test = ret;
  ret.next = ret; // You can define an arbitrary number of members here
  ret.XXX = func(); // Like this, and you can still chain it like your question

  return ret;
}
于 2012-08-30T17:00:57.043 に答える
0

あなたの意図が何であるかはわかりませんが、これは連鎖Test可能な機能になります:

function Test(){
  Test.retest = Test.retest || function(){console.log('retested'); return Test;}
  return Test;
}
Test().retest().retest().retest().retest();
/* => result
 retested
 retested
 retested 
 retested
*/
// and
log(Test() === Test); //=> true
于 2012-09-01T10:13:50.870 に答える
0
test = function(){

  var someFunc = function(){
      //...code
  }

  return {
      someFunc:someFunc,
      next:this
  }
}

編集- 明確にするために、質問の更新を反映するように更新しました。

于 2012-08-21T22:37:42.047 に答える