'这'关键字'原型'

时间:2016-08-22 01:01:32

标签: javascript prototype this

这是代码

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())

我的问题是thisgetSuperValue引用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()

0 个答案:

没有答案