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

能否通过原型为外部类添加非静态方法 可在方法内使用this、__proto__?

原型添加实例方法的this访问问题解答

结论

可以通过原型为类实例添加方法,且方法内部可以正常访问this,你当前运行失败是代码写法错误导致的,和功能本身能否实现无关。

错误原因分析

  • 错误1:使用箭头函数定义原型方法
    箭头函数没有独立的this上下文,它的this绑定的是函数定义时所在的外层作用域的this,而不是调用方法的类实例。你在全局作用域下定义该箭头函数,this指向的是全局对象(浏览器端为window,Node端为globalThis),自然找不到实例的name属性。
  • 错误2:caller.__proto__.name语法非法
    你直接写的caller不是JS内置的全局变量,不存在该变量会直接抛出引用错误。同时__proto__已经是JS废弃的非标准属性,不建议在生产代码中使用,要获取实例的原型对象请使用标准API Object.getPrototypeOf(this)。

正确实现代码

把箭头函数替换为普通函数表达式即可:

PersonClass.prototype.SayHello2 = function() {
  // 普通函数的this会在调用时动态绑定为触发方法的实例对象
  console.log(this.name, Object.getPrototypeOf(this).type);
};

// 调用测试
aria.SayHello2() // 输出:Ned Stark human

补充说明

你之前写的PrintType能正常运行是因为你没有使用this,直接硬编码访问了PersonClass.prototype.type,如果把实现改成console.log(this.type),用箭头函数定义的PrintType同样会运行失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:15:01