最近在看class中,首先代码如下:
class Logger {
printName(name = 'there') {
this.print(`Hello ${name}`);
}
print(text) {
console.log(text);
}
}
const logger = new Logger();
const { printName } = logger;
printName(); // TypeError: Cannot read property 'print' of undefined
当实例化之后,this指向实例化的对象,因此printName()
运行这个方法之后由于this指向logger,所以logger里面并没有print方法(print方法在原型中)。
但是问题来了,我将上面代码的最后一行改成这样:
logger.printName();
这不报错了,而且能正确显示。
请问printName()和logger.printName(),这两种写法的区别在哪里,为何后者就能够正确显示,printName()中的this指向不都是实例化logger吗?
首先你知道class的本质其实就是原型链
prototype
那么上述代码其实本质就是:
可以看到方法
printName
方法是在原型链上的,this指向也是Logger()这个函数,在实体化后指向的是实体。这里的this指向是一个新的对象!
而在你这里说的
这是对象的解构,适用于这种:
而这里的this指向的是window,上面两者的构造方式不同,性质不同,this指向也不同,你直接用es6的解构来解新对象的原型链方法,是不合理的