prototype.jsä¸ç”¨äº†å¤§é‡çš„applyå’Œcall函数åQŒä¸æ³¨æ„ä¼?x¨¬)é€ æˆç†è§£åå·®ã€?br />官方解释åQšåº”用æŸä¸€å¯¹è±¡çš„一个方法,用å¦ä¸€ä¸ªå¯¹è±¡æ›¿æ¢å½“å‰å¯¹è±¡ã€?br />apply与call的区别是½W¬äºŒä¸ªå‚æ•îC¸åŒã€‚apply是Â?数组或者arguments 对象。而call是逗å·éš”开的ä“Q何类型ã€?/p>
apply,callæ–ÒŽ(gu¨©)³•最让ähæ·äh·†çš„地方也是apply,call的特艌Ӏ‚但最好ä¸è¦æ»¥ç”¨ã€?br />能改å˜è°ƒç”¨å‡½æ•°çš„对象。如下例åQŒå‡½æ•îC¸ç”¨åˆ°this关键å—,˜q™æ—¶å€™this代表的是apply,callå‡½æ•°çš„ç¬¬ä¸€ä¸ªå‚æ•°ã€?br />
<script src="prototype1.3.1.js"></script>
<input type="text" id="myText"Â value="input text">
<script>
  function Obj(){
      this.value="对象åQ?;
  }
  var value="global å˜é‡";
  function Fun1(){
      alert(this.value);
  }
  window.Fun1();
  Fun1.apply(window);
  Fun1.apply($('myText'));
  Fun1.apply(new Obj());
</script>
2ã€å…³äºŽé—åŒ?/strong>
prototype.js在Class.create,bind½{‰ä¸ç”¨åˆ°javascriptçš„é—包特艌Ӏ‚但整体上prototype.js对于强大的é—包特性用的ä¸å¤šã€‚大家å¯ä»¥å‚阅我¾˜»è¯‘çš?a class="" title="" href="/zkjbeyond/archive/2006/05/23/47725.html" target="_blank">½‹‡æ–‡ç« 了解é—åŒ?/a>ã€?br />3ã€è®©æˆ‘æ¯”è¾ƒåæ„Ÿçš„两个æ–ÒŽ(gu¨©)³•
åQ?åQ?br />var Class = {
 create: function() {
   return function() {
     this.initialize.apply(this, arguments);
   }
 }
}
很讨厌用别的è¯è¨€çš„é£Žæ ¼æ¥å†™javascript。用˜q™ä¸ªæ–ÒŽ(gu¨©)³•æž„é€ è‡ªå®šä¹‰¾c»Â?òq¶æ²¡æœ‰è§‰å¾—有多方便,å‡å°‘代ç 行数åQŒåªä¼?x¨¬)让人难ç†è§£åQŒå¤šå®šä¹‰ä¸€ä¸ªinitializeæ–ÒŽ(gu¨©)³•ã€?br />其实讨厌˜q™æ¡æœ‰äº›ç‰µå¼ºåQŒä¸˜q‡ä¿®æ”¹Object的原型对象就有点˜q‡åˆ†äº†ã€?br />åQ?åQ‰Object.prototype.extend
 先丘q‡ä½ å–个extendçš„åå—会(x¨¬)让熟æ‚(zh¨¨n)‰javaçš„äh引è“vçš„æ§ä¹‰ã€‚修改Objectçš„prototypež®Þp¯´ä¸è¿‡åŽÖMº†ã€‚ä¸çŸ¥é“ä½œè€…æ˜¯æ€Žä¹ˆè€ƒè™‘çš„ã€‚å½“ä½ for in循环对象是,éºÈƒ¦ž®±æ¥äº†ã€‚å¯èƒ½æœ‰äºÞZ¼š(x¨¬)é—®ä½ for inòq²å—ã€?æˆ‘ä¸€ä¸ªé¡¹ç›®ä¸æ—¢ç”¨äº†DWR,也用了prototype.jsåQŒdwr˜q”回的javascript对象都多了个exetend属性,˜q˜å¾—ç‰ÒŽ(gu¨©)®Šå¤„ç†ã€?br />Â ä»¥å‰æˆ‘比较过dojoå’Œprototype.jsä¸ç‘ô承的实现åQŒçŽ°åœ¨æˆ‘æ˜Žç™½ä¸ªé“ç†ã€‚对于javascript˜q™ç§æ²¡æœ‰é™æ€ç±»åž‹æ£€æŸ¥ï¼Œè¯æ³•宽æ¾çš„è¯a€æ¥è®²åQŒå¦‚æžœä½ é€‰æ‹©äº†æŸä¸ªjs¾cÕdº“åQŒé‚£ä½ 也必须适应作者写javascriptçš„é£Žæ ¹{€‚prototype.js的作者对extendçš„ä‹É用炉ç«çº¯é’,如果我们ä¸å½“å®ƒåªæ˜¯ä¸ªå±žæ€§æ‹·è´çš„函数的è¯åQŒå¤šè¯»è¯»prototype.jsçš„ä»£ç æ˜¯å¥½çš„ã€?br />4ã€å…³äºŽå‡½æ•°çš„¾l‘定
 ¾cÕdº“æä¾›äº†Function.prototype.bind Function.prototype.bindAsEventListener两个æ–ÒŽ(gu¨©)³•。首先我们从概念上解释一个这两个æ–ÒŽ(gu¨©)³•ã€?br />ä»ÖM½•一个函数都å¯ä»¥è°ƒç”¨˜q™ä¸¤ä¸ªæ–¹æ³•ï¼›å‚æ•°çš„æ˜¯javascript对象或网™åµä¸Šå…ƒç´ 对象åQ›è¿”回类型是个函数对象ã€?br />æœ¬æ¥æˆ‘就是个函数åQŒè¿”回还是函敎ͼŒåˆ°è¿™ä¸¤ä¸ªå‡½æ•°æœ‰ä»€ä¹ˆä¸åŒå‘¢ã€‚看实现代ç åQŒå…³é”®è¿˜æ˜¯apply\call函数的代ç ã€‚å…¶å®žè¿™é‡Œåªæ˜¯è{化了一下方法调用的对象ã€?/p>
<script src="prototype1.3.1.js"></script>
<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.chkBox.onclick = this.showMessage.bindAsEventListener(this);
      },
      showMessage: function(evt) {
         alert(this.message + ' (' + evt.type + ')');
      }
   };
new CheckboxWatcher('myChk','message!!!!');
//$('myChk').onclick=function(){};
</script>
˜q™æ˜¯ https://compdoc2cn.dev.java.net/ 上ä‹D的例å,个ähæ„Ÿè§‰æ²¡ä»€ä¹ˆæ„æ€ï¼Œå而让我对bind,bindAsEventListeneræœ‰äº›åæ„Ÿã€‚(javascriptž®±æ˜¯˜q™æ ·åQŒæ˜Žæ˜Žå¤§å®‰™ƒ½çŸ¥é“çš„è¯æ³•,但写出æ¥çš„代ç 差别确很大åQ?br />看下é¢ä»£ç :(x¨¬)
<script src="prototype1.3.1.js"></script>
<input type=checkbox id=myChk name="chk" value=1> Test
<script>
function Class(){
   this.name="class";
}
Class.prototype.getName=function(){
   alert(this.name);
}
var obj=new Class();
//$('myChk').onclick=obj.getName;
$('myChk').onclick=obj.getName.bind(obj);
//$('myChk').onclick=obj.getName.bind($('myChk'));
</script>
从上é¢ä»£ç å¯ä»¥çœ‹å‡?font color="#ff0000">bind/bindAsEventListeneråªæ˜¯åŒ…装了一下apply/callæ–ÒŽ(gu¨©)³•åQŒæ”¹å˜æ–¹æ³•的调用对象ã€?/font>如例åï¼Œä½ å¯ä»¥æŠŠobj.getNameæ–ÒŽ(gu¨©)³•转化æˆä“Q何对象调用,òq¶ä¸”把方法让表å•å…ƒç´ è§¦å‘。(bindå’ŒbindAsEventListenerä¹‹é—´åªæ˜¯˜q”å›žå‡½æ•°çš„å‚æ•îC¸åŒï¼‰
˜q™ä¸¤ä¸ªæ–¹æ³•也å¯ä»¥ç”¨åœ¨å¯¹è±¡ä¹‹é—´çš„æ–¹æ³•é‡ç”¨ï¼Œå®žçް¾cÖM¼¼¾l§æ‰¿æ–ÒŽ(gu¨©)³•的概å¿üc€‚看以下代ç åQŒå…¶å®žæ˜¯æ¯”è¾ƒæ— èŠçš„ã€?/p>
<script src="prototype1.3.1.js"></script>
<script>
function Class1(name){
   this.name=name;
}
Class1.prototype.getName=function(){
   alert(this.name);
}
function Class2(name){
   this.name=name;
  this.getName=Class1.prototype.getName.bind(this);
}
var obj1=new Class2("yql");
obj1.getName();
var obj2=new Object();
obj2.name="zkj";
obj2.fun=Class1.prototype.getName.bind(obj2);
obj2.fun();
</script>
æˆ‘ä»Žæ¥æ²¡è¯»è¿‡prototype.js的扩展项目代ç ,也ä¸çŸ¥é“bind..的最ä½?j¨©ng)_®žè·µï¼Œä¸€èµähŒ–掘å§ã€‚ä½†ä½ ç»å¯¹ä¸è¦æŠŠbind/bindAsEventListener从绑定的è¯ä¹‰ä¸Šæ¥ç†è§£åQŒå¯èƒ½ä¼š(x¨¬)è®©ä½ æ›´åŠ ˜qähƒ‘。从apply/callç†è§£æœ¬è´¨ã€‚应用æŸä¸€å¯¹è±¡çš„一个方法,用å¦ä¸€ä¸ªå¯¹è±¡æ›¿æ¢å½“å‰å¯¹è±¡ã€?/p>
5ã€å…³äºŽäº‹ä»¶çš„æ³¨å†Œ
<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>
执行上é¢ä»£ç åQŒä½ ž®Þpƒ½æ˜Žç™½Event.observe与bind/bindAsEventListener之间的区别:(x¨¬)
åQˆï¼‘åQ?昄¡„¶Event.observe有é™åˆÓž¼Œåªèƒ½å¤„ç†½Ž€å•的函数åQŒåƈ函数ä¸ä¸èƒ½æœ‰this之类的东è¥Ñ€?br />åQˆï¼’åQ‰Event.observe内部用到addEventListeneråQattachEventã€‚èƒ½æŠŠå¤šä¸ªå‡½æ•°åŠ åˆîC¸€ä¸ªè§¦å‘事ä»Óž¼ˆwindow.onloadåQ‰ã€‚bind是覆盖ã€?/p>
6ã€å…³äºŽäº‹ä»¶ç›‘嬿œ€ä½?j¨©ng)_®žè·?/strong>
很显然prototype.jsæä¾›çš„äº‹ä»¶æ³¨å†Œæ–¹æ³•ä¸æ˜¯å¾ˆå®Œå–„。那看看dojo的时间注册å§åQ?a class="" title="" target="_blank">䏿–‡ç‰?/a>åQ‰ï¼Œæ›´åР夿‚åQŒä¼°è®¡å¾ˆå¤šähåƒæˆ‘ä¸€æ øP¼Œå¯¹äºŽdojo暂时æŒè§‚望æ€åº¦ã€?br />å¦‚æžœä½ çœ‹˜q‡çš„å‰ç¯‡å…³äºŽé—包的介¾l,å¯èƒ½è§è¿‡ä»¥ä¸‹ä»£ç ã€?br />看以下代ç 剿ˆ‘想表述一个观点,ä»ÖM½•¾|‘页ä¸å…ƒç´ ,‹¹è§ˆå™¨éƒ½ä¼?x¨¬)äØ?f¨´)ä½ åˆ›å»ÞZ¸€ä¸ªå¯¹è±¡ï¼ˆè§?/a>åQ‰ã€‚(我觉得)˜q™äº›å¯¹è±¡ä¸Žä½ 建立javascript对象区别是它们有事äšg监å¬åQŒä¼š(x¨¬)å“åº”é¼ æ ‡é”®ç›˜çš„äº‹ä»¶ã€‚å¦‚æžœä½ ç”¨äº†ä»¥ä¸‹ä»£ç åQŒé‚£ä¹ˆæŠŠäº‹äšg监å¬ä»£ç 很好的è{åŒ–åˆ°ä½ çš„javascript代ç ä¸ã€?/p>
æœ‰æ—¶é—´æˆ‘æƒ³ç”¨ä»¥ä¸Šæ€æƒ³å®žçŽ°ä¸€ä¸ªç½‘™å‰|ÕQ动框拖拉的代ç ï¼ˆå…¶å®žå·²ç»æœ‰å¾ˆå¤šäº†åQ‰ï¼Œå¾…箋........
Â
Â
引用åQšajaxcn.org 链接。谢谢dlee
Â