jquery 部分代码:jQuery.cache = function(name, value) {
   try{
       return window.parent.jQuery.cache(name, value);
   }catch(e){
       return "";
   }
};我的理解红字部分是给jquery对象扩充了一个新属性cache,这样我们可以通过引用这个属性来达到我们的要求
Date.prototype.format = function(format) 
 var defaults = {
         "y+" : this.getFullYear(),
         "M+" : this.getMonth()+1,
         "d+" : this.getDate(), 
         "h+" : this.getHours(), 
         "m+" : this.getMinutes(), 
         "s+" : this.getSeconds(),
         "S"  : this.getMilliseconds()
     };
     var param,value;
     for(var n in defaults){
       if(new RegExp("("+ n +")").test(format)){
          param = RegExp.$1;
          value = ""+defaults[n];
          if(value.length===1){value="0"+value;}
          if(param.length===1 && value.length<=2){value="0"+ value;}
          format = format.replace(param, value); 
        }
     }
     return format; 
}
蓝字部分,Date.prototype.format ,我的理解是给Date对象扩充了新的属性format通过比较我发现,我在想,能不能把Date.prototype.format 改成Date.format 哦?就是取消中间的prototype我通过实验发现,好象是不可以,但是为什么红字部分可以哦?

解决方案 »

  1.   

    这是两个不同的东西。不知道你说红字“可以”是指怎么个可以法啊?
    我不用jQuery,不过猜测用jQuery的时候应该是直接用jQuery.cache()吧,肯定不是new jQuery().cache()。要这样用肯定也是找不到的。
    Date类就不一样了,你要用的时候肯定是new Date()生成一个对象,再调用对象的方法,所以必须加在prototype里。
    这是一个JavaScript的基础问题,JS是我们常用的语言中唯一使用原型式继承的语言。当new一个对象的时候所有方法都继承自类的原型(即prototype)。所以想要在对象里找到新定义的方法,就必须修改prototype。
    而jQuery.cache = function()这样语法是没有问题的,不过表达的完全是另一回事,这个时候jQuery更像是一个命名空间(实际是一个对象)。
      

  2.   

    难道
    jQuery.cache = function(name, value) {}
    是在jQuery命名空间上增加新的属性?我这样理解对吗?
      

  3.   

    lz应该去了解下javascript的prototype链。
      

  4.   

    恩,我现在在加紧学习javascript权威指南,是个不错的书籍。
      

  5.   

    这是这个写法的作用之一,我习惯叫做方法而不是属性。不过你的这段代码,实际意义是在重写。因为很明显JQuery里原来就有cache这个方法。而这段代码是在重定义cache。具体是把a页面的cache复制给b页面。
    lz可以参考下3楼的见解。
    另外prototype是JS的特色。可以把它理解为对原型对象(或者说父类、超类)的引用。之所以需要prototype,可以理解为Date是已封装的构造函数。要从外部定义它内部的东西,必须用prototype。而且这种定义,会影响所有通过new Date()声明出来的对象。而你的想法,去掉prototype。那样的话就变成试图从构造函数{}外部去直接定义构造函数{}内部的方法。所以如果非要去掉,应该是对实例化之后的Date。影响范围也仅限于该实例。即:var ddd=new Date();ddd.format=function(format){....}
    至于Jquery,本身是在用户端自定义的。和你的重写功能的代码在同一层。所以可以不用prototype直接写。
    这些只是我的理解,对错不敢肯定。也没有做过测试验证。
    lz既然研究,不如多点散发。
    再试试别的组合,如
    测试JQuery.cache加上prototype看看。
    测试prototype的作用:
    var d=new Date();
    Date.prototype.format=function(){alert("old");};
    var dd=new Date();
    var ddd=new Date();
    ddd.format=function(){alert(new);};d.format();
    dd.format();
    ddd.format();
      

  6.   

    function car(sColor)
    {
    this.color = sColor;
    this.showcolor = function () {
    alert(this.color)
    };
    }
    这是个构造函数,我可以car.showcolor= function(){ alert("over write")}吧?
    但这样new时每个对象都创建了独立的函数版本(showcolor).这个跟jQuery.cache = function(name, value) { }应该是一个道理吧?
    如果用原型方式加构造就应该这样
    function car(sColor)
    {
    this.color = sColor;
    }
    car.prototype.showcolor = function () {
    alert(this.color)};//函数属性只创建一次。(书上说的)当然你也可以重写这个原型函数:
    car.prototype.showcolor  = function () {alert("重写")};
    其实楼主问的问题就是为什么不能直接car.showcolor = function (){alert(this.color)};其实感觉是对的呀。 我感觉是不是Date.prototype.format已经存在,所以你不可以用Date.format去重写呢??
    我也是提问啊!高手指点下