能否在类方法上调用apply()方法?调用返回undefined问题求助
类方法上调用
apply()的问题解答 当然可以在类方法上调用apply()啦!不过你的代码里有几个小问题导致返回了undefined,咱们一步步拆解修复:
问题分析
apply()的this指向错误:apply()的第一个参数是用来指定方法执行时的this上下文的。你传了e1.name(也就是字符串"Todd"),这会让info()里的this变成这个字符串对象,而不是你的Person实例e1。这样this._name自然找不到对应的值,方法逻辑直接出错。info()方法未正确接收参数:
你想用apply()把children数组传给info(),但你的info()方法里直接引用了全局的children变量,而且没有定义参数来接收传递的值。就算this没问题,这里也没法正确拼接出你想要的字符串。参数传递方式不匹配:
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
相关产品推荐
相关产品推荐

