为实例方法创建错误的引用(js的问题)
2023-12-23 08:38:25
考虑下面代码:
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");
}
Ok,看起来没啥问题。
接着,看看当我们调用obj.whoAmI()
?和?whoAmI()
?的区别。
obj.whoAmI(); // Outputs "MyObj" (as expected)
whoAmI(); // Outputs "window" (uh-oh!)
什么地方出错了?当我们进行赋值时 var whoAmI = obj.whoAmI
,新的变量whoAmI
被定义在全局命名空间。结果,this
的值是 window
,而不是 MyObject
的 obj
实例!
因此,如果我们真的需要为一个对象的现有方法创建一个引用,我们需要确保在该对象的名字空间内进行,以保留 this
值。一种方法是这样做:
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(); // Outputs "MyObj" (as expected)
obj.w(); // Outputs "MyObj" (as expected)
文章来源:https://blog.csdn.net/dxn16638400024/article/details/135161763
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!