You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS中已将player2原型设为player1时,player1如何调用player2的方法?

JavaScript中player1调用player2方法的实现方案

现有代码已经通过Object.setPrototypeOf(player2, player1)实现了player2调用player1的kick方法,要实现player1调用player2的smash方法,可采用以下几种方案:


方案1:设置player1的原型指向player2

直接修改player1的原型指向player2,即可让player1继承player2的所有属性和方法:

let player1 = {
  kick() {
    return 'kicking..';
  }
};

let player2 = {
  smash() {
    return 'smashing..';
  }
};

Object.setPrototypeOf(player2, player1);
// 新增设置player1的原型为player2
Object.setPrototypeOf(player1, player2);

console.log(player2.kick()); // 输出 kicking..
console.log(player1.smash()); // 输出 smashing..

*注意:该方案会形成player1 ↔ player2的循环原型链,虽然JS语法支持该写法,但生产环境不推荐,可能引发原型链遍历的性能问题。


方案2:无侵入式调用(无副作用)

如果不需要修改原型链,只是单次调用方法,可直接通过call/apply/bind借用player2的方法:

// 原有代码不需要修改
let player1 = {
  kick() {
    return 'kicking..';
  }
};

let player2 = {
  smash() {
    return 'smashing..';
  }
};
Object.setPrototypeOf(player2, player1);

// 单次调用直接绑定上下文为player1
console.log(player2.smash.call(player1)); // 输出 smashing..

// 需要重复调用可提前绑定
const player1Smash = player2.smash.bind(player1);
console.log(player1Smash()); // 输出 smashing..

该方案不会修改两个对象的原有原型结构,适合临时调用的场景。


方案3:直接挂载方法到player1

如果希望player1永久拥有smash方法,直接将player2的方法赋值给player1即可:

player1.smash = player2.smash;
console.log(player1.smash()); // 输出 smashing..

内容的提问来源于stack exchange,提问作者JLMasc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:54:00