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
相关产品推荐
相关产品推荐

