3.3 当心,这里的bind对我无用
我们再次解释bind。bind也叫绑定,它是把一个对象应用于指定的对象,叠加、覆盖对象上下文对象的功能,同时传递一些参数进去,如果这个被应用的对象是function对象,则我们返回这个被应用后的function对象实例,否则我们将改变原有对象并返回这个被应用的对象。如果bind应用于function的时候,允许为以后返回的应用后的function对象设置N个默认参数,而以后对这个新的被应用的function的调用都不需要传递这些参数。
而定义function后,通过prototype的方式定义属性或方法叫做后期绑定。
这时,这个被应用的function对象运行时arguments的情形是:
arguments[0 ~n前面N个参数是bind的时候默认设置的,后面的0 ~ n是调用这个被应用的方法时传递进来的参数]
现在我们定义了一个Object,里面有个属性是function对象,这个function在平常调用的时候,它的this就是这个Object对象,因此在这个function中可以通过“this.Object其他属性或方法”的方式来访问其他属性或方法。那么,我们调用这个function的bind方法,将另外一个对象替换、叠加这个function里的this,也就是“替换”这个Object对象,但是又保留它的原有属性和方法,那我们不是“偷天换日”也把Object给实现bind了?
简单来说,用前面给Function对象增加[]运算符号的原理,即[ ].apply.push能影响this的内容并保留下来,如图3-3所示。
|
| 图3-3 Object bind图示 |
其实不然,因此读者可要小心了,以后可千万不要这样想了,请见下面的代码。
<html> <head><meta http-equiv=content-type content=“text/html; charset=utf-8”> <title>当心,这里的bind对我无用</title> <style> html,body,td,p,div,span,th { font-size:9pt; } </style> </head> <body> <script type="text/javascript" language="JavaScript" src="/jcore/resource /javascript/Jcore.js"></script> <script type="text/javascript" language="JavaScript"> <!-- var oTestObjectBind = { name:"情是一种意境", fnDisplayBind: function() { // 原本想在这里输出绑定进来的对象的属性或方法 alert(this.bindValue) }, fnBindFunc:function() { alert([this.bindValue || "bindValue还没有值", this.name || "name还没有值"].join("\n") ) } };// 这里只能输出"情是一种意境",因为还没有绑定呢 oTestObjectBind.fnBindFunc(); // 看来绑定只是oTestObjectBind.fnBindFunc的函数临时的一个实例 // 这里却无法访问oTestObjectBind的name // 当然,我们再call的时候使用oTestObjectBind.name)是完全没问题的 oTestObjectBind.fnBindFunc.call({ bindValue:"欲为诸佛龙象,先做众生马牛。", fnMyBindFunc:function(){alert(this.name)} });
// 这里调用会发生错误,因为没有改变原有实例的this // oTestObjectBind.fnDisplayBind(); // 我们始终得到的是"情是一种意境" oTestObjectBind.fnBindFunc(); </script> </body> </html> |
看来,在“第2章2.5节”中为Function描述和设计的bind还是不够完美!那么,如何设计更加完善呢,请看3.4节。
【责任编辑:
夏书 TEL:(010)68476606】