JavaScript中能否在Function.call()方法中传入数组参数?
能否给call方法传入数组作为参数?
当然可以!虽然call()方法本身的设计是接收逐个列举的独立参数,而非数组,但我们可以借助一些语法技巧,实现和apply()一样用数组传参的效果。
最简便的方式:ES6展开运算符(...)
ES6的展开运算符可以直接把数组“拆解”成单个参数,完美适配call()的参数要求。结合你给出的代码示例,我们可以这样修改:
function Product(name, price) { this.name = name; this.price = price; } function Food(name, price) { // 定义一个参数数组 const productParams = [name, price]; // 用展开运算符把数组拆成call需要的单个参数 Product.call(this, ...productParams); this.category = 'food'; } console.log(new Food('cheese', 5).name); // 输出: "cheese"
这段代码的效果和使用Product.apply(this, productParams)完全一致,只是用call()配合展开运算符实现了数组传参。
ES5环境的兼容写法
如果你的代码需要兼容不支持ES6的旧环境,可以通过嵌套调用apply()来实现:
function Product(name, price) { this.name = name; this.price = price; } function Food(name, price) { const productParams = [name, price]; // 借助Function.prototype.call的apply方法间接传数组 Function.prototype.call.apply(Product, [this].concat(productParams)); this.category = 'food'; } console.log(new Food('cheese', 5).name); // 输出: "cheese"
这里的逻辑是:apply()会把第二个参数的数组拆成目标方法(这里是call())的参数,[this].concat(productParams)就拼成了call()需要的「上下文对象 + 逐个参数」的完整列表。
小结
call()本身不直接支持数组参数,但通过ES6展开运算符或者ES5的嵌套apply技巧,就能轻松实现和apply()一致的数组传参能力,按需选择即可。
内容的提问来源于stack exchange,提问作者Shrirang Kadale
相关产品推荐
相关产品推荐

