JavaScript中两个原型方法定义写法的差异是什么?
为什么两段User1构造函数代码执行结果不同?
先看两段代码的实际表现:
代码1(输出undefined)
var User1 = function (name, age) { this.name = name; } User1.prototype.getName = () => { return this.name; } var x = new User1("gladiator"); console.log(x.getName());
代码2(输出gladiator)
var User1 = function (name, age) { this.name = name; } User1.prototype.getName = function () { return this.name; } var x = new User1("gladiator"); console.log(x.getName());
这个问题的核心差异,全在箭头函数和普通函数的this指向规则上!
先看代码2里的普通函数:当我们调用
x.getName()时,普通函数的this是在调用时绑定的,它会指向调用这个方法的对象——也就是我们用new创建出来的User1实例x。所以this.name就是x.name,自然能拿到"gladiator"。再看代码1里的箭头函数:箭头函数的
this是在定义时就固定死的,它不会自己绑定this,而是直接继承外层作用域的this。这里我们是在全局环境下定义的箭头函数,外层作用域的this在浏览器里是window对象,Node.js里是global对象,而这个全局对象里根本没有我们设置的name属性,所以返回undefined。
简单说:箭头函数天生不适合做原型方法,因为它没法绑定到实例的this上,普通函数才是原型方法的正确打开方式~
内容的提问来源于stack exchange,提问作者Gladwin Kurian
相关产品推荐
相关产品推荐

