javascript - 有没有一种方法可以在 Javascript 中将多个函数分配给一个函数?

标签 javascript function

在 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;

但我希望看看第一个是否是查看可能的语法/用例的选项。

谢谢!

最佳答案

更新

我编写了一个更抽象的语法来实现相同的功能。请参阅之前的答案以获取解释。

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");

上一个答案

这就是实现这一点的方法。 这里的概念是将函数视为第一类对象,这意味着函数可以具有属性。

现在您将拥有的第一个函数必须在末尾有两行额外的行。

 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();

如果这解决了您想要做的事情或者您不明白这里的任何内容,请告诉我。

关于javascript - 有没有一种方法可以在 Javascript 中将多个函数分配给一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42662110/

相关文章:

c - 为什么我的计算字母和数字的程序没有运行?

php - 如何在数组中查找一个值并使用 PHP 数组函数将其删除?

c - 如何用C语言调用ML接口(interface)(函数)

c++ - 将数组存储在单独的类文件中

javascript - 如何自动更新url中js文件的版本

java - 输入字段更改后的 Wicket 数据表过滤

javascript - 关联数组中的键名

javascript - 单选按钮检查

JavaScript .addEventListener

javascript - Highchart 未执行