<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>afcn0</title>
    <description></description>
    <link>http://afcn0.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Prototype修改版本，比jQuery还好用的事件注册器</title>
        <author>afcn0</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afcn0.javaeye.com">afcn0</a>&nbsp;
          链接：<a href="http://afcn0.javaeye.com/blog/133291" style="color:red;">http://afcn0.javaeye.com/blog/133291</a>&nbsp;
          发表时间: 2007年10月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Prototype非常强大，但是jQuery也非常好用，Prototype当然也象jQuery学习了，比如$$的css选择器，可是使用起来依然不是那么方便，并且随着1.60出现，Prototype库越来越大，我有个想法，想在一定程度上修改Prototype，增加一些有用的功能，去掉一些没用的东西，第一个版本，我扩展了事件的注册机制<br />原本在Prototype里面如果想注册事件，必须这样<pre name="code" class="java">$("id").observe("click",function(){alert("hello world")})</pre> 注册多个元素一般这样<pre name="code" class="java">$$("div img").each(function(node){node.observe("click",function(){alert("hello")})})</pre>相当的麻烦，那我扩展出了$E函数，专门接受特殊事件伪类选择器添加事件处理函数，可以这样用<br /><pre name="code" class="java">$E("#id::click")(function(){alert("hello world")});</pre>甚至<br /><pre name="code" class="java">$E("#id::click")("alert('hello world')");</pre>怎么样，简单吧，其实就是原来的css选择器文本加"::"伪类标志，加事件名，比如"click",还添加了Chain.bindEvent方法，可以实现一次大量元素添加事件，比如，现在我想给很多元素添加事件，看下面代码<br /><pre name="code" class="java">var target={
"#bbb::click":"alert(234);return false",
"#bbb2::mouseover":function(){alert("haha")},
"#bbb3::mouseout":"prompt()",
"input::mouseover":"confirm('eee')"
}
Chain.bindEvent(target)</pre>这样就全搞定了，以后你所要维护的就是页面当中的一个事件参数列表了，甚至这个列表可以象css一样在各个页面当中复用，本修改版是基于1.5.11版本
          <br/>
          <span style="color:red;">
            <a href="http://afcn0.javaeye.com/blog/133291#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 18 Oct 2007 22:47:59 +0800</pubDate>
        <link>http://afcn0.javaeye.com/blog/133291</link>
        <guid>http://afcn0.javaeye.com/blog/133291</guid>
      </item>
      <item>
        <title>JavaScript原形链多继承函数</title>
        <author>afcn0</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afcn0.javaeye.com">afcn0</a>&nbsp;
          链接：<a href="http://afcn0.javaeye.com/blog/132590" style="color:red;">http://afcn0.javaeye.com/blog/132590</a>&nbsp;
          发表时间: 2007年10月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          JavaScript由于对象使用原形继承,原形链只能有一条,所以一般不能实现多继承,就算是多继承,也是把别的构造函数内容拿过来,修改一下context在原来构造函数基础上继续执行,我写了个自认为可以实现多继承的函数<br /><pre name="code" class="java">Object.extend = function(destination, source) {
  for (var property in source)
    destination[property] = source[property];
  return destination;
};
Object.prototype.mix=function(sub){
sub.call(this);
var temp=Object.extend({},sub.prototype);
temp.__proto__=this.__proto__;
this.__proto__=temp
} 
</pre><br />使用:<br /><pre name="code" class="java">>>> function test(){this.a=123}   
>>> test.prototype.b=345  
345  
>>> a={}   
Object   
>>> a.mix(test)   
>>> a   
Object a=123 b=345  
>>> function test2(){this.c=678}   
>>> test2.prototype.test3=789  
789  
>>> a.mix(test2)   
>>> a   
Object a=123 c=678 test3=789 b=345  </pre><br />其中定义了空对象a,后分别继承自test和test2构造函数,都有prototype继承,并且对于原构造函数无侵入影响<br /><pre name="code" class="java">
>>> test2.prototype   
Object test3=789  
>>> test.prototype   
Object b=345  </pre><br />主要是利用closure封闭住__proto__原原形上级,中间使用temp中转,各位高手看看这样可行吗,我想不出来不使用__proto__实现的方法
          <br/>
          <span style="color:red;">
            <a href="http://afcn0.javaeye.com/blog/132590#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 16 Oct 2007 18:00:00 +0800</pubDate>
        <link>http://afcn0.javaeye.com/blog/132590</link>
        <guid>http://afcn0.javaeye.com/blog/132590</guid>
      </item>
      <item>
        <title>如何跨越原形链调方法</title>
        <author>afcn0</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://afcn0.javaeye.com">afcn0</a>&nbsp;
          链接：<a href="http://afcn0.javaeye.com/blog/132555" style="color:red;">http://afcn0.javaeye.com/blog/132555</a>&nbsp;
          发表时间: 2007年10月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我们知道js对象很多属性方法都不是自己的，也就说都不是早绑定上去的，比如"aa"有很多方法，当然它是基本类型，不是对象，但是js由于有String Boolean Number这三个影子wrapper所以基本类型也可变对象，与本文无关，本文讲的是怎么跨原形链调用函数，比如<br /><pre name="code" class="java">a=[1,2,3];alert(a);</pre> 看到的是1,2,3，其实这个不是a对象的toString方法，是在Arry.prototype.toString上面的，这个我们也知道，但是现在我就是想实现不走它，而调用Object.prototype.toString，可能有朋友说是不是delete(Array.prototype.toString)不是就可以了，当然可以了，但是你删除了其他数组的toString方法，&^%$*&^，当然不可以，所以，我想到了个办法，其实无非就是改变context了，toString吗，关键就是谁toString，所以<br /><pre name="code" class="java">a=[1,2,3];alert(Object.prototype.toString.call(a));</pre>很不错吧，但是写这文的时候，我又想到了个办法，就是<br /><pre name="code" class="java">a=[1,2,3];a.toString=Object.prototype.toString;alert(a)</pre>晚强绑定，看着很不错，其实跨越原形链最好的解决办法还是象最后不走原形链，后者象我第一个解决办法就是自己手动找函数手动指定context，完美,原形链无处不在，不管字符串的各种方法，还是数组的push pop slice splice，都是原形链，如果说学习js不懂原形链，太遗憾了
          <br/>
          <span style="color:red;">
            <a href="http://afcn0.javaeye.com/blog/132555#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 16 Oct 2007 16:48:09 +0800</pubDate>
        <link>http://afcn0.javaeye.com/blog/132555</link>
        <guid>http://afcn0.javaeye.com/blog/132555</guid>
      </item>
  </channel>
</rss>