能否通过原型为外部类添加非静态方法 可在方法内使用this、__proto__?
原型添加实例方法的this访问问题解答
结论
可以通过原型为类实例添加方法,且方法内部可以正常访问this,你当前运行失败是代码写法错误导致的,和功能本身能否实现无关。
错误原因分析
- 错误1:使用箭头函数定义原型方法
箭头函数没有独立的this上下文,它的this绑定的是函数定义时所在的外层作用域的this,而不是调用方法的类实例。你在全局作用域下定义该箭头函数,this指向的是全局对象(浏览器端为window,Node端为globalThis),自然找不到实例的name属性。 - 错误2:
caller.__proto__.name语法非法
你直接写的caller不是JS内置的全局变量,不存在该变量会直接抛出引用错误。同时__proto__已经是JS废弃的非标准属性,不建议在生产代码中使用,要获取实例的原型对象请使用标准APIObject.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
相关产品推荐
相关产品推荐

