论坛首页 Web前端技术论坛

学习javascript中,有关对象,prototype和this疑问

浏览 7091 次
精华帖 (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对象中的一个静态方法,为什么内部不可以直接调用呢?

   发表时间:2007-10-31  
呃~~~楼主
要说清楚this和prototype机制,起码要书的一个章节
建议lz去看看《JavaScript权威指南》(第五版)
另外,不要自己臆测,javascript不是java或c++,它本身还是属于解释性语言
0 请登录后投票
   发表时间:2007-10-31  
一个方法的scope里面怎么可能包含另一个方法的引用,initialize也是方法,和showMessage完全平级,只不过默认调用
0 请登录后投票
   发表时间:2007-10-31  
ajaxgo 写道


呃~~~楼主
要说清楚this和prototype机制,起码要书的一个章节
建议lz去看看《JavaScript权威指南》(第五版)
另外,不要自己臆测,javascript不是java或c++,它本身还是属于解释性语言


那本书我以前看过,可能是悟性比较差,有些概念当时就不是很明白,我很希望把这些不明白的地方能清楚,所以希望有人能给通俗易懂的解释一下,

补充一下:我个人很反感那些回帖说让回去好好补补基础,看看书,缺没有解释问题,如果你把问题解释清楚了,然后说我个人基础差,可以,我虚心接受,可是有多少人只是看书就能解决所有遇到的问题呢,举一反三的人能有多少?我认为屈指可数。
0 请登录后投票
   发表时间:2007-10-31  
afcn0 写道
一个方法的scope里面怎么可能包含另一个方法的引用,initialize也是方法,和showMessage完全平级,只不过默认调用


谢谢,明白了。
0 请登录后投票
   发表时间:2007-10-31  
可以使用prototypejs的bind方法。
具体用法可以参考prototypejs的bind方法的使用文档.
0 请登录后投票
   发表时间:2007-10-31  
ls不是的,bind只修改context和传递调用参数,但是类似ie不传递event对象无法解决,所以Prototype当中有bindAsEventListener修补ie不传递event的缺陷
0 请登录后投票
   发表时间: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之类的东西。
不是很明白
0 请登录后投票
   发表时间:2007-10-31  
1.6版本以前,Event.observe加入的处理函数,不会自动把this指向当前dom元素,你可以用bind系列的两个函数来解决这个问题。
1.6开始默认绑定了触发事件的dom元素为this,当然也一样可以用bind改变。
0 请登录后投票
   发表时间:2007-10-31  
仔细看Prototype原代码,也可以上Prototype的mailing list问问,更可以加入Prototype core讨论组,ls没有说全面,其实是attachEvent的bug
$('myChk').onclick=showMessage.bind($('myChk'));   

根本不用bind直接
$('myChk').onclick=showMessage
就可以
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics