精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-10-31
<head> <script src="prototype.js" type="text/javascript"></script> </head> <body> <input type=checkbox id=myChk name="asf" value=1/> Test <script> var CheckboxWatcher = Class.create(); CheckboxWatcher.prototype = { initialize: function(chkBox, message) { this.chkBox = $(chkBox); this.message = message; this.show = showMessage; this.chkBox.onclick = this.showMessage.bindAsEventListener(this); }, showMessage: function(evt) { alert(this.message + ' (' + evt.type + ')'); } }; new CheckboxWatcher('myChk','message!!!!'); 疑问: 1.如果我把this.showMessage的this去掉为什么就不能运行了? 我觉得showMessage应该是prototype对象中的一个静态方法,为什么内部不可以直接调用呢? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-10-31
呃~~~楼主
要说清楚this和prototype机制,起码要书的一个章节 建议lz去看看《JavaScript权威指南》(第五版) 另外,不要自己臆测,javascript不是java或c++,它本身还是属于解释性语言 |
|
返回顶楼 | |
发表时间:2007-10-31
一个方法的scope里面怎么可能包含另一个方法的引用,initialize也是方法,和showMessage完全平级,只不过默认调用
|
|
返回顶楼 | |
发表时间:2007-10-31
ajaxgo 写道 呃~~~楼主 要说清楚this和prototype机制,起码要书的一个章节 建议lz去看看《JavaScript权威指南》(第五版) 另外,不要自己臆测,javascript不是java或c++,它本身还是属于解释性语言 补充一下:我个人很反感那些回帖说让回去好好补补基础,看看书,缺没有解释问题,如果你把问题解释清楚了,然后说我个人基础差,可以,我虚心接受,可是有多少人只是看书就能解决所有遇到的问题呢,举一反三的人能有多少?我认为屈指可数。 |
|
返回顶楼 | |
发表时间:2007-10-31
afcn0 写道 一个方法的scope里面怎么可能包含另一个方法的引用,initialize也是方法,和showMessage完全平级,只不过默认调用
谢谢,明白了。 |
|
返回顶楼 | |
发表时间:2007-10-31
可以使用prototypejs的bind方法。
具体用法可以参考prototypejs的bind方法的使用文档. |
|
返回顶楼 | |
发表时间:2007-10-31
ls不是的,bind只修改context和传递调用参数,但是类似ie不传递event对象无法解决,所以Prototype当中有bindAsEventListener修补ie不传递event的缺陷
|
|
返回顶楼 | |
发表时间:2007-10-31
afcn0 写道 ls不是的,bind只修改context和传递调用参数,但是类似ie不传递event对象无法解决,所以Prototype当中有bindAsEventListener修补ie不传递event的缺陷
这又揭开了我另一个问题,先看一段网上摘抄的代码: <script src="prototype1.3.1.js"></script> <input type=checkbox id=myChk name="chk" value=1> Test <script> Event.observe(myChk, 'click', showMessage, false); //$('myChk').onclick=showMessage; //$('myChk').onclick=showMessage.bind(); $('myChk').onclick=showMessage.bind($('myChk')); function showMessage() { alert(this.value); } </script> 网上的解释是:Event.observe有限制,只能处理简单的函数,并函数中不能有this之类的东西。 不是很明白 |
|
返回顶楼 | |
发表时间:2007-10-31
1.6版本以前,Event.observe加入的处理函数,不会自动把this指向当前dom元素,你可以用bind系列的两个函数来解决这个问题。
1.6开始默认绑定了触发事件的dom元素为this,当然也一样可以用bind改变。 |
|
返回顶楼 | |
发表时间:2007-10-31
仔细看Prototype原代码,也可以上Prototype的mailing list问问,更可以加入Prototype core讨论组,ls没有说全面,其实是attachEvent的bug
$('myChk').onclick=showMessage.bind($('myChk')); 根本不用bind直接 $('myChk').onclick=showMessage就可以 |
|
返回顶楼 | |