更新
私は同じことを実現するために、より抽象化された構文を書きました。説明のために前の答えを見てください。
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();
が、これはあなたがここには何も理解していない場合は、あなたが何をしたいか、何を解決するかどうか、私に教えてください:
はここで完全なコードです。
'+ ='はそのようには動作しません。解決しようとしている問題は何ですか?あなたは、あなたが複数の機能を付けるために必要な多くの選手を持つつもりですか?プレイヤー間で機能が異なるのでしょうか? – Matt
私はChakraBridgeを使って.NETクラスをJavascriptに公開しています。この場合、LogDetailsは実際.NETの+ =を使用して登録するイベントです。私は、Javascriptに似たようなものがあると思っていましたが、別の構文かもしれません。 LogDetails = playerDetailsは機能します(例:.NETでイベントを発生させ、Javascript関数が呼び出されます)が、イベントに登録された複数の関数を実行したいのですがどうしたらいいですか? – Water
'playerDetails()'の後に 'playerDetailsSecond()'を実行するコールバックや約束を使うのはなぜですか? – shole