在JavaScript中,如果我有:
var foo = function(){}
foo.prototype.bar = function() {
console.log(this);
}
baz = new foo();
baz.name = 'baz';
bing = new foo();
bing.name = 'bing';
baz.bar();
bing.bar();
setTimeout(baz.bar);
setTimeout(bing.bar);
在我的控制台中,我按顺序看到了baz,bing,window,window对象的记录.
要看到的最简单或“正常”的诡计是什么:
baz,bing,baz,bing使用foo原型中bar函数内的“this-like”变量记录?
当我说“这样”时,我的意思是,我可以在bar()中使用一个变量来访问该对象,它现在和以后都是一种方法.
编辑:
进一步澄清,我想避免需要知道何时调用bar()它会想要使用它,因此我需要做类似bind()的操作.假设当我在baz或bing上调用bar()时,它就是一个“黑盒子”.我想调用bar()作为bing或baz的方法而不知道它是如何工作的,我希望bar()的内部知道它是一个方法的对象.
解决方法:
如果您不想使用bind(),一种策略是在构造时将“绑定”方法附加到对象,“间接”引用它.
这个:
var foo = function(){
var _this = this;
this.bar = function() {
console.log(_this);
}
}
baz = new foo();
baz.name = 'baz';
bing = new foo();
bing.name = 'bing';
baz.bar();
bing.bar();
setTimeout(baz.bar);
setTimeout(bing.bar);
日志:
baz
bing
baz
bing
但总的来说,我喜欢在可能的情况下使用它,所以我可以将我的方法应用于其他对象,如果需要的话.我只是假设他们使用这个来封装我在匿名函数中的“延迟调用”:
setTimeout(function() { baz.bar(); });
setTimeout(function() { bing.bar(); });
标签:javascript,this,prototype 来源: https://codeday.me/bug/20190703/1369395.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。