JavaScript prototype 中属性赋值为函数后有关 this 的疑惑

看了《JavaScript高级程序设计》中关于对象的介绍,关于prototype中属性赋值为函数后有关this疑惑。

使用构造函数创建对象时,prototype中如果定义一个属性指向函数,在函数中引用this,为什么this是指向构造函数而不是prototype对象?

试验:

function SuperType() {
    this.property = 'value in SuperType'
    this.obj = {
        testThis: function() {
            console.log(this)
            console.log(this.testValue)
            console.log(this.property)
        },
        testValue: 'value in SuperType.obj',
    }
}

SuperType.prototype.getSuperValue = function() {
    console.log(this)
    return this.property
}

const test = new SuperType()

test.obj.testThis()
// output:
// { testThis: [Function: testThis], testValue: 'test' }
// value in SuperType.obj
// undefined

const r = test.getSuperValue()
console.log(r)
// output:
// SuperType {
//  property: true,
//  obj: { testThis: [Function: testThis], testValue: 'value in SuperType.obj' }
// }
// value in SuperType

按照书上的讲解,test实例的结构应该是如下的(伪代码):

test = {
    __proto__: {
        constructor: SuperType,
        getSuperValue: function() { ... },
    },
    obj: {
        testThis: function() { ... },
        testValue: 'value in SuperType.obj',
    },
    property: 'value in SuperType',
}

__proto__既然和obj同一层级的,那getSuperValue应该就和testValue是有同样的表现才对呀,为什么getSuperValue可以读取到property的值呢?

阅读 845
评论
    4 个回答

    首先,“__proto__既然和obj同一层级的,那getSuperValue应该就和testValue是有同样的表现才对呀”,没有这种规则的。

    其次,this 要么为 undefined,要么指向一个对象,只有这两种情况。所以不会指向构造函数。

    当 this 指向一个对象时,具体指向谁,取决于函数定义和调用的方式,与定义在哪儿无关。

    具体有六种情况,看这里吧

      相似问题
      推荐文章