this指向
类的方法内部如果有this,默认指向类的实例。 但单独使用该方法时,很可能会报错。
class Logger{ printName(name = 'there'){ this.print(`hello ${name}`); } print(text){ console.log(text); } } const logger = new Logger(); //实例化 const {printName } = logger; //printName printName(); // 报错 VM77:3 Uncaught TypeError: Cannot read property 'print' of undefined
printName方法中的this ,默认指向Logger类的实例化对象,但如上单独使用的时候,this会指向该方法运行时指向的环境(此时的运行环境是window吗?我在window下添加了print方法后还是同样报错(___________)),因为找不到print方法而报错。
解决方案:
1. 在构造方法中绑定this,这样实例化时 this就会指向当前实例
class Logger{ constructor(){ this.printName = this.printName.bind(this); } //... }
2.使用箭头函数
class Logger{ constructor(){ this.printName = (name = 'there') => { this.print(name); } } }
3.使用 Proxy, 获取方法的时候,自动绑定this
(回头看Proxy时候补上)
function selfish(target){ const cache = new WeakMap(); const handler = { } }