[JavaScript] 如何改变getter方法中this的指向

1. 普通方法中的this指向

let a = {
    b() {
        return this;
    }
};

console.log(a.b() === a);          //true

let c = {
    d: a.b
};

console.log(c.d() !== a);          //true
console.log(c.d() === c);          //true
console.log(c.d.call(a) === a);    //true

2. getter方法中的this指向

let a = {
    get b() {
        return this;
    }
};

console.log(a.b === a);            //true

let c = {
    d: a.b
};

console.log(c.d === a);            //true

因为c.d的值,在c初始化的时候就确定了(是a调用getter方法b返回的值。

3. 改变getter方法中this的指向

因为b实际上是一个方法,每次访问b属性的时候,都进行了方法调用,
而方法实际上是类型为函数的属性。

利用这两点,我们可以构建一个对象x,以a为原型,x.__proto__===a
这个新对象是没有b方法(或属性)的。

访问x.b如果找不到的话,根据原型继承,会自动到x.__proto__中查找b属性,即在a对象上查找b属性。

因为调用方式是x.b,根据简记法b前面是x,所以这样调用b方法中的this就会指向x了。(“简记法”可以查EcmaScript规范验证,此处略。

let a = {
    get b() {
        return this;
    }
};

console.log(a.b === a);    //true

let c = Object.create(a);

console.log(c.b !== a);    //true
console.log(c.b === c);    //true

4. 让getter方法中的this指向任意对象

let a = {
    get b() {
        return this;
    }
};

console.log(a.b === a);    //true

let c = {};
Reflect.setPrototypeOf(c, a);

console.log(c.b === c);    //true

其中,Reflect.setPrototypeOf(c, a)的作用相当于设置c.__proto__a


注:
通过Reflect.getOwnPropertyDescriptor(a, 'b').get可以得到getter方法。


参考

getter - MDN
Object.create - MDN
Reflect.setPrototypeOf()
Reflect.getOwnPropertyDescriptor()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 属性的简洁表示法 ES6允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。 上面代码表明,ES6允...
    呼呼哥阅读 7,972评论 0 2
  • 1.属性的简洁表示法 允许直接写入变量和函数 上面代码表明,ES6 允许在对象之中,直接写变量。这时,属性名为变量...
    雨飞飞雨阅读 4,853评论 0 3
  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 11,592评论 3 22
  • …突然间没有想说的话了 或许话太多,不知道从何说起 最近经历了一些事情 在道德边缘挣扎 可我真的厌倦了曾经的生活 ...
    柠檬兔博士阅读 2,472评论 0 0
  • 大宝还有一周就三岁半了。三岁半的孩子有你想不到的敏感。 中午午睡,辰辰在床上怎么都不睡,又是要听故事,又是蹦来蹦去...
    晨间的风阅读 3,897评论 3 2

友情链接更多精彩内容