2017-03-08 22 views
1

1つの関数が呼び出されると、それに割り当てられた複数の関数が呼び出されるように、Javascriptで可能ですか?以下はJavascriptで複数の関数を1つの関数に割り当てる方法はありますか?

は、私が何をしたいです:

var player1= {name: "Chris", score: 1000, rank: 1}; 
var player2= {name: "Kristofer", score: 100000, rank: 2}; 

function playerDetails(){ 
alert("The name of the player is "+ this.name + "."+ " His score is : "+ this.score + "and his rank : "+ this.rank); 
} 

function playerDetailsSecond() 
{ 
//Do something else 
} 

player1.logDetails= playerDetails; 
player2.logDetails= playerDetails; 

//Is it possible to do this? 
player1.logDetails += playerDetailsSecond; 
player2.logDetails += playerDetailsSecond; 

player1.logDetails(); //calls both playerDetails and playerDetailsSecond 
player2.logDetails(); //calls both playerDetails and playerDetailsSecond 

+ =、具体的には、私が何をしたいです。

function combined() 
{ 
playerDetails(); 
playerDetailsSecond(); 
} 

player1.logDetails = combined; 

しかし、私は最初のものが可能構文/ユースケースを見るためのオプションであるかどうかを確認するために期待しています:

私はオプションのような何かを知っています。

ありがとうございました!

+1

'+ ='はそのようには動作しません。解決しようとしている問題は何ですか?あなたは、あなたが複数の機能を付けるために必要な多くの選手を持つつもりですか?プレイヤー間で機能が異なるのでしょうか? – Matt

+0

私はChakraBridgeを使って.NETクラスをJavascriptに公開しています。この場合、LogDetailsは実際.NETの+ =を使用して登録するイベントです。私は、Javascriptに似たようなものがあると思っていましたが、別の構文かもしれません。 LogDetails = playerDetailsは機能します(例:.NETでイベントを発生させ、Javascript関数が呼び出されます)が、イベントに登録された複数の関数を実行したいのですがどうしたらいいですか? – Water

+0

'playerDetails()'の後に 'playerDetailsS​​econd()'を実行するコールバックや約束を使うのはなぜですか? – shole

答えて

1

更新

私は同じことを実現するために、より抽象化された構文を書きました。説明のために前の答えを見てください。

var player1 = { name: "Chris", score: 1000, rank: 1 }; 

function playerDetails(arg1, arg2) { 
    console.log("The name of the player is " + this.name + "." + " His score is : " + this.score + "and his rank : " + this.rank + arg1 + arg2); 

    //make sure you add this line at the end 
    arguments.callee.invokeExtras(this, arguments); 
} 


//you do not need to look into this code. 
// this code adds functionality of pushing extra functions. 
playerDetails.addFunction = function(fn) { 
    this.extraFns?this.extraFns.push(fn):this.extraFns = [fn]; 
} 
playerDetails.invokeExtras = function(context, args) { 
    this.extraFns?this.extraFns.forEach(function(fn) { fn.apply(context, args) }):null; 
} 
//upto here 

function playerDetailsSecond(arg1, arg2) { 
    console.log("The name of the player is " + this.name + arg1 + arg2); 
} 

function playerDetailsThird(arg1, arg2) { 
    console.log("new extra funtion " + this.name + arg1 + arg2); 
} 


player1.logDetails = playerDetails; 

player1.logDetails.addFunction(playerDetailsSecond); 
player1.logDetails.addFunction(playerDetailsThird); 

player1.logDetails("test1", "test2"); 

前の回答

これは、あなたがこれを実装する方法です。 ここでの概念は、ファンクションがプロパティを持つことができるファーストクラスのオブジェクトとしてファンクションを扱うことです。

ここで最初に行う機能には、最後に2行の余分な行が必要です。

var self = this; 
arguments.callee.extraFns.forEach(function (extraFunction) { extraFunction.call(self) }); 

と関数の宣言の後、あなたは関数に空の配列extraFnsを追加する必要があります。

var player1 = { name: "Chris", score: 1000, rank: 1 }; 

function playerDetails() { 
    console.log("The name of the player is " + this.name + "." + " His score is : " + this.score + "and his rank : " + this.rank); 

    var self = this; 
    arguments.callee.extraFns.forEach(function (extraFunction) { extraFunction.call(self) }); 
} 

playerDetails.extraFns = []; 

function playerDetailsSecond() { 
    console.log("The name of the player is " + this.name); 
} 

function playerDetailsThird() { 
    console.log("new extra funtion " + this.name); 
} 


player1.logDetails = playerDetails; 

player1.logDetails.extraFns.push(playerDetailsSecond); 
player1.logDetails.extraFns.push(playerDetailsThird); 

player1.logDetails(); 

が、これはあなたがここには何も理解していない場合は、あなたが何をしたいか、何を解決するかどうか、私に教えてください:

はここで完全なコードです。

+0

ありがとうpranav、それは動作します!最後の質問ですが、もし私も子関数のいくつかのパラメータを持っていますか? – Water

+0

ようこそ! あなたの関数はすべて同じ数の引数を必要とし、extraFunction.call(self、a、b、c ..)に渡すことができます。 また、アップアップして答えを受け入れることができます。 :) – pranavjindal999

+0

素晴らしい!ありがとうございました。 – Water

1

あなたが文法的な砂糖を探しているのであれば、私はそのようなことは認識していません。 Array.push()はおそらく、汎用オブジェクトを何かに追加するための最短の方法です。

最も簡単な方法は、関数が複数の関数を呼び出すことです。関数をPlayerクラスにアタッチすると、すべてのプレイヤーは同じ関数を継承します。あなたがプログラム的に機能を追加するために探している場合

class Player { 

    logDetails() { 
    function1(arguments) 
    function2(arguments) 
    } 

} 

あなたはPlayerクラスに何かを実装することができます。すべてのプレイヤー

class Player { 

    static addLogFn (fn) { 
    this.logFunctions.push(fn) 
    } 

    logDetails() { 
    for (let fn of this.constructor.logFunctions) { 
     fn.apply(this, arguments) 
    } 
    } 

} 
Player.logFunctions = [] 

let player1 = new Player() 
player1.name = 'meee' 
player1.rank = 'peon' 
Player.addLogFn(function(arg){console.log(this.name, arg)}) 
player1.logDetails('a') // => "meee a" 
Player.addLogFn(function(arg1, arg2){console.log(this.rank, arg2)}) 
player1.logDetails('b','c') // => "meee b\npeon c" 

それとも、多分あまりにもES2015 Proxyオブジェクトを見て個々の選手

class Player { 

    constructor() { 
    this._logFunctions = [] 
    } 

    logDetails() { 
    for (let fn of this._logFunctions) { 
     fn(arguments) 
    } 
    } 

    addLogFunction (fn) { 
    this._logFunctions.push(fn) 
    } 

} 

するための機能を設定したい場合はプレイヤーのインスタンスを使用するために

。同じ球場にありますが、ここではうまく適用されないかもしれないターゲットオブジェクトの動作を変更することができます。

関連する問題