function Parent(){}
Parent.prototype = {
console:function(){
let name = "vayne"
console.log(this.name);
}
}
let name = "蝙蝠侠";
let a = new Parent();
a.console.call(name);
这段代码为什么没有输出 蝙蝠侠?
另外如果是
a.console(name)
是不是应该输出vayne?
call/apply 方法可以改变 this 的指向。
对于
a.console.call(name)
,name 虽然是基本数据类型,但会被悄咪咪地转换为对应的基本包装类型对象(此处即 String)。你可以在 console 方法中打印 this 看看。那么对于该对象,是没有 name 属性的。因此会打印 undefined。至于
a.console()
,网上有关于 this 指向的总结,适用于大部分场景。之所以这么说,是因为在一些情况下,那个结论无法解释的通,但是对于日常开发而言是足够的了。其中一个情况就是函数被作为对象的方法调用时,方法内部的 this 指向为该对象。即此时 console 方法内部的 this 指向对象 a,而 a 也是没有 name 属性的,因为在构造函数 Parent 中并没有给实例对象赋予任何变量或方法。