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

能否在类方法上调用apply()方法?调用返回undefined问题求助

类方法上调用apply()的问题解答

当然可以在类方法上调用apply()啦!不过你的代码里有几个小问题导致返回了undefined,咱们一步步拆解修复:

问题分析

  1. apply()的this指向错误:
    apply()的第一个参数是用来指定方法执行时的this上下文的。你传了e1.name(也就是字符串"Todd"),这会让info()里的this变成这个字符串对象,而不是你的Person实例e1。这样this._name自然找不到对应的值,方法逻辑直接出错。

  2. info()方法未正确接收参数:
    你想用apply()把children数组传给info(),但你的info()方法里直接引用了全局的children变量,而且没有定义参数来接收传递的值。就算this没问题,这里也没法正确拼接出你想要的字符串。

  3. 参数传递方式不匹配:
    apply()的第二个参数是数组,它会把数组的每一项展开成单独的参数传给目标方法。但你的info()没有定义对应的参数来接收这些展开后的项,导致参数根本没被正确使用。

修复后的代码

这里提供两种常见的修复方式,你可以根据需求选择:

方式一:让info()直接接收数组参数

class Person {
  constructor(name) {
    this._name = name;
  }
  get name() {
    return this._name;
  }
  set name(newValue) {
    this._name = newValue;
  }
  // 修改info方法,直接接收孩子列表数组
  info(children) {
    // 用模板字符串和join方法拼接更简洁
    return `${this._name} is the father of ${children.join(", ")}`;
  }
}

var children = ["Jason", "Karla", "David"];
var e1 = new Person("Todd");
// apply第一个参数传实例e1(保证this指向正确),第二个参数是包含数组的数组(因为info只接收一个参数)
var ref = e1.info.apply(e1, [children]);
document.querySelector(".test").innerHTML = ref;

方式二:让apply()展开数组为多个参数

class Person {
  constructor(name) {
    this._name = name;
  }
  get name() {
    return this._name;
  }
  set name(newValue) {
    this._name = newValue;
  }
  // 用剩余参数语法接收所有传入的孩子名字
  info(...children) {
    return `${this._name} is the father of ${children.join(", ")}`;
  }
}

var children = ["Jason", "Karla", "David"];
var e1 = new Person("Todd");
// apply第一个参数传e1,第二个参数直接传children数组(会被展开为三个参数传给info)
var ref = e1.info.apply(e1, children);
document.querySelector(".test").innerHTML = ref;

总结

类方法本质上就是绑定在类原型上的函数,完全可以用apply()、call()或者bind()来调整this指向或者传递参数。核心要注意两点:

  • 确保apply()的第一个参数是正确的this上下文(通常是类的实例);
  • 目标方法的参数定义要和你通过apply()传递的参数方式匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:05:07