常见错误八:为实例方法创建错误的指引

最后更新于:2022-04-01 01:49:27

我们来看下面一段代码: ~~~ var MyObject = function() {} MyObject.prototype.whoAmI = function() { console.log(this === window ? "window" : "MyObj"); }; var obj = new MyObject(); ~~~ 现在为了方便起见,我们新建一个变量来指引 whoAmI 方法, 因此我们可以直接用 whoAmI() 而不是更长的obj.whoAmI(): ~~~ var whoAmI = obj.whoAmI; ~~~ 接下来为了确保一切都如我们所预测的进行,我们可以将 whoAmI 打印出来: ~~~ console.log(whoAmI); ~~~ 结果是: ~~~ function () { console.log(this === window ? "window" : "MyObj"); } ~~~ 没有错误! 但是现在我们来查看一下两种引用的方法: ~~~ obj.whoAmI(); // 输出 "MyObj" (as expected) whoAmI(); // 输出 "window" (uh-oh!) ~~~ 哪里出错了呢? 原理其实和上面的第二个常见错误一样,当我们执行 var whoAmI = obj.whoAmI;的时候,新的变量 whoAmI 是在全局环境下定义的。因此它的this 是指window, 而不是obj! 正确的编码方式应该是: ~~~ `var MyObject = function() {} MyObject.prototype.whoAmI = function() { console.log(this === window ? "window" : "MyObj"); }; var obj = new MyObject(); obj.w = obj.whoAmI; // still in the obj namespace obj.whoAmI(); // 输出 "MyObj" (as expected) obj.w(); // 输出 "MyObj" (as expected) ` ~~~
';