使用apply调用类实例方法时无法读取constructor初始化属性如何解决
问题原因
核心原因是调用apply()时没有指定函数执行的this上下文:
- 直接执行
object.TestFunc()时,JavaScript会默认将方法内的this绑定到所属的object实例上,所以可以正常读取实例属性this.text。 Function.prototype.apply()的第一个参数就是用来指定函数运行时的this指向,你没有传入该参数时,严格模式下this会被赋值为undefined,非严格模式下会指向全局对象,你的运行环境属于严格模式,所以访问this.text就抛出了属性读取错误。
解决方法
按需选择以下任意一种方案即可:
- 方案1:补全
apply的this参数
把object[fname].apply();修改为object[fname].apply(object);即可,如果需要给目标方法传参,把参数数组作为apply的第二个参数传入即可。 - 方案2:使用
call方法(适合参数逐个传入的场景)
修改为object[fname].call(object, 参数1, 参数2, ...)。 - 方案3:直接通过动态属性调用(无特殊需求优先选该方案)
如果有参数可以配合扩展运算符使用,写法更简洁:object[fname](...参数数组)。
修改后的通用Loader方法参考:
Loader(cname, fname, ...args){ const template = require(`./${cname}.js`); const object = new template(); // 不需要传参就直接写 object[fname].apply(object); object[fname].apply(object, args); }
内容的提问来源于stack exchange,提问作者LaszloR1
相关产品推荐
相关产品推荐

