为何JavaScript中调用原型方法时this指向实例而非原型?
为什么原型链上的方法调用时this指向实例而非原型对象?
首先纠正一个关键误解:实例对象并没有prototype属性,prototype是构造函数(比如Person)的专属属性。你以为的p.prototype.getName()根本不存在,运行时会直接抛出Cannot read properties of undefined (reading 'getName')的错误。
核心原因:this的隐式绑定只看「调用时的调用对象」
JavaScript中,通过点运算符调用方法时,this的绑定规则是指向点左侧的调用对象,这个规则和方法是属于调用对象自身,还是从原型链上查找而来的没有任何关系。
拿你的第三个例子来说:
Person.prototype.getName = function() { return this.name; } function Person(name, age) { this.name = name; this.age = age; } const p = new Person("toseef", 21); p.getName() // 返回"toseef"
当执行p.getName()时,JS引擎会先在p自身的属性中查找getName,找不到就顺着原型链向上找,最终在Person.prototype上找到这个方法。但调用这个方法的主体仍然是p,所以this会被绑定到p上,自然能返回p.name的值。
对比嵌套对象的例子验证规则
再看你第二个嵌套对象的例子:
const obj = { name: 'Toseef', nested: { getName() { return this.name } } } obj.nested.getName() // 返回undefined
这里getName是nested自身的方法,调用时的调用对象是nested,所以this指向nested——和第三个例子的逻辑完全一致,都是看调用时的左侧对象,和方法所在的位置无关。
总结
不管方法是在对象自身还是原型链上,只要是通过X.method()的形式调用,this就必然指向X。你之前的错误是误以为方法在原型上,调用时的上下文就会变成原型对象,但实际上原型链只是用来查找方法的位置,并不会改变方法调用时的this绑定规则。
内容的提问来源于stack exchange,提问作者touseef Ahmad
相关产品推荐
相关产品推荐

