prototype属性的使用,为何会出错呢?初级代码  <script type="text/javascript">
var d =new Date();
//d.prototype.tmp="新属性" //这一句为何出错,可是下面这一句就正确呢?
Date.prototype.tmp="新属性";
alert(d.toLocaleDateString());
alert(d.tmp);
  </script>
为何会这样呢?
实例化后的对象,为何不能用这个属性呢?
难道这个属性,只能用内置对象来调用吗?
好象只有两个内置对象呀。一个Date,一个Global,
是不是只有这两个对象才能使用 prototype 属性呀?

解决方案 »

  1.   

    Javascript源码分析 QQ群:84507704  欢迎大家加入 共同讨论 共同进步
      

  2.   

      <script type="text/javascript">
        var d = new Date();
        d.constructor.prototype.tmp="新属性" //这一句为何出错,可是下面这一句就正确呢?
        Date.prototype.tmp="新属性";
        alert(d.toLocaleDateString());
        alert(d.tmp);
      </script>
      

  3.   

    引用d就调用了new Date()结果返回字符串,必须回溯构造类才能够在原型上添加属性。
    Date是JS内置的时间类—可以想象为一个没有new操作的构造函数,当然可以在原型上添加属性。
      

  4.   

    我那说法也不正确!
    我理解,这难在JS的“一切皆对象,是对象都有原型”的概念,是中文词汇“对象”表述出问题。
    是的,String、Number、Array、Object、Function等都是对象,它们都有原型(prototype),但是"xxx"、3、[]、{}、function(){}等一一分类继承前者但不等于前者。前者是类,后者是实例。
    一个类可以衍生出千千万万实例,假设实例都有原型的话就有数不清的prototype,都从什么地方继承来的?继承的模板(prototype)唯独一个!
    对象String、Number、Array、Object、Function等有prototype,而实例"xxxx"、3、[]、{}、function(){}都没有(也不能够有)prototype。
    如:function(){}就没有prototye,只能function(){}.constructor在prototype上添加属性,来给所有函数实例继承。实际上,function(){}.constructor就是Function,d.constructor就是String。
    通俗说,"hgjhj"是字符串对象,但不等于说是String对象,此对象非彼对象。
    唉,说着说着连自己都绕进去了,它NND ......
      

  5.   

    还是不正确,函数具有且必须有prototype,不运行作为构造器使用,运行后prototype消失。
    具有了这样的特性,刚定义没有运行的函数既是Function的实例,又实际上构造了一个JS类。
    <script type="text/javascript">
    var foo=function(){};
    foo.prototype.temp="新属性";
    alert(new foo().temp);
    </script>
      

  6.   

    <script type="text/javascript">
        var d =new Date();
        //d.prototype.tmp="新属性"        //这一句为何出错,可是下面这一句就正确呢?
        Date.prototype.tmp="新属性";
        alert(d.toLocaleDateString());
        alert(d.tmp);
      </script>prototype应该是Function对象拥有的。因为d不是一个Function,它是一个实例,所以它没有prototype
    而Date可以说是一个Function,所以Date有prototype
      

  7.   

    prototype并非只是Function对象才拥有的 
    Object,String Date ==都拥有.............    var d =new Date();
        //d.prototype.tmp="新属性"        //这一句为何出错,可是下面这一句就正确呢?
        Date.prototype.tmp="新属性";
        alert(d.toLocaleDateString());
        alert(d.tmp);至于这句为什么报错d是new Date()的实例 d本身是不带prototype这个属性的  会查找到Date.prototype.prototype.tmp
    这个属性是找不到的  肯定会报告错误这么写就不会报告错误了
        Date.prototype.prototype={}
        var d =new Date();
        //d.prototype.tmp="新属性"        //这一句为何出错,可是下面这一句就正确呢?
        Date.prototype.tmp="新属性";
        alert(d.toLocaleDateString());
        alert(d.tmp);
      

  8.   

    d本身没有prototype
    undefined.tmp肯定出错咯
      

  9.   

    综上所述
      var d = new Date();
           d.prototype.tmp="新属性"//错误
           d.constructor.prototype.tmp="新属性" //正确
          // Date.prototype.tmp = "新属性";  //正确
           alert(d.toLocaleDateString());
           alert(d.tmp);