Array.prototype.push调用元素的哪个原型方法?自定义类实例入组转指定结构
问题解答
1. Array.prototype.push 会调用传入元素的哪个原型方法?
Array.prototype.push 不会主动调用传入元素的任何原型方法——它的逻辑很直接:把传入的每个参数直接作为元素引用添加到数组末尾,不会对元素做任何隐式转换或方法调用。
只有在你自己编写的代码触发了隐式类型转换(比如将元素和原始值做运算)时,才会调用元素的valueOf或Symbol.toPrimitive等方法,但这和push本身的行为无关。
2. 如何让BaseRoleResolver实例推入数组时自动转为RoleReward结构?
直接用原生push的话,它不会自动转换你的类实例——数组里会直接存实例本身。但结合你已经实现valueOf的情况,有两种可行方案:
方案一:显式调用转换方法
在push时手动调用valueOf,把转换后的结构传入数组:
const resolver = new BaseRoleResolver(); const roleRewards: Array<RoleReward> = []; roleRewards.push(resolver.valueOf()); // 存入RoleReward结构而非实例
方案二:封装自定义数组(自动转换)
如果想让转换自动发生,不用手动写valueOf,可以封装一个继承自Array的自定义类,重写push方法来处理转换逻辑:
class RoleRewardArray extends Array<RoleReward> { push(...items: (RoleReward | BaseRoleResolver)[]): number { const convertedItems = items.map(item => item instanceof BaseRoleResolver ? item.valueOf() : item ); return super.push(...convertedItems); } } // 使用示例 const roleRewards = new RoleRewardArray(); roleRewards.push(new BaseRoleResolver()); // 自动转为RoleReward结构存入
至于重写类的原型方法(比如valueOf或Symbol.toPrimitive),这些方法只有在元素被强制/隐式转换为原始值时才会触发,而push本身不会触发这种转换,所以靠重写这些方法无法实现自动存入RoleReward结构的需求。
内容的提问来源于stack exchange,提问作者BigBrainAFK
相关产品推荐
相关产品推荐

