这是代码
function SuperType(){
this.property = 'aa';
}
SuperType.prototype.property='aaa'
SuperType.prototype.getSuperValue = function(){
console.log("this===s : "+(this===s))
console.log("this===SuperType.prototype : "+(this===SuperType.prototype))
return this.property;
}
var s=new SuperType();
console.log(s.getSuperValue())
我的问题是this
中getSuperValue
引用s
的原因?在正常意义上,它应该引用' SuperType.prototype'。
乍一看,getSuperValue()
会调用s
,因此this
范围内的getSuperValue
应引用s
。
不过s.getSuperValue
实际上是s.__proto__.getSuperValue()
,这就是我认为this
中的getSuperValue
引用SuperType.prototype
==========================================
我研究了How does the "this" keyword work?中的所有答案,未能找到解释问题的任何内容
我真正的理由是
s.getSuperValue() <=> Object.getPrototypeOf(s).getSuperValue.call(s)
虽然我错误地认为它是
s.getSuperValue() <=> Object.getPrototypeOf(s).getSuperValue()
对于那些关心的人,只需将答案放在这里
===============================================
对此问题有了新的认识
即使函数驻留在原型
中console.log(s.getSuperValue===s.__proto__.getSuperValue) //true
查找过程与this
的绑定方式无关
console.log(s.getSuperValue()) // 'aa'
console.log(s.__proto__.getSuperValue()) //'aaa'
this
仅由函数调用的位置决定
=================== update ================
更具说明性的例子:
function merge(a, b){
if (a && b) {
for (var key in b) {
a[key] = b[key];
}
}
return a;
};
var a={hello:"world"}
var aa={hi:function () {
console.log(this.hello)
}}
var aaa=merge(a,aa)
aaa.hi()