var p=function(items){
        this.items = new Array();
        for(var i=0;i<items.length;i++){
            this.items.push(items[i]);
        }
    }
    p.prototype.items=new Array();
    var p1 = new p(["p1","p2"]);
    var p2 = new p(["p3"]);    alert(p2.items);这个跟闭包无关,主要是p.prototype.items=new Array();定义了一个属性,这个属性是共享的,子对象共享该属性,虽然无法修改这个属性,但是可以操作此属性

解决方案 »

  1.   


    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
    <title>Untitled Document</title>
    </head><body>
    <script type="text/javascript">
        var p=function(items){
        this.items=new Array();
            for(var i=0;i<items.length;i++){
                this.items.push(items[i]);
            }
        }
        
        var p1 = new p(["p1","p2"]);
        var p2 = new p(["p3"]);    alert(p2.items);  </script>
    </body>
    </html>
      

  2.   

    打快了,应该是继承了该原型的对象,这些对象无法修改该属性,例如他们无法让items等于一个function或是指向别的array,但是由于items是对象,可以根据items的引用调用对象的函数修改该items。this.items=new Array();加了这句话就是为了覆盖原型对象的items属性,让继承的对象自己有一个items属性,而不是使用原型对象的items属性
      

  3.   


    <script type="text/javascript">
        var p=function(items){
    p.prototype.items=new Array();
            for(var i=0;i<items.length;i++){
                this.items.push(items[i]);
            }
        }
        
        var p1 = new p(["p1","p2"]);
        var p2 = new p(["p3"]);    alert(p2.items);  </script>
      

  4.   

    用prototype创建的属性和方法将会被所有new出的实例共享.也就是说在创建P1和p2实例时,并没有分别创建p1.items和p2.itemsp.prototype.items只是一个空的数组对象,当var p1 = new p(["p1","p2"])时,实际是对p.prototype.items添加了数组成员同理var p2 = new p(["p3"]);于是你alert(p2.items);实际alert的是p.prototype.items
      

  5.   


    楼上的,你试试alert(p1.items);
      

  6.   


    呵呵,俺的本职工作是java,继承了父类就是子类,javascript这里没有类的概念,继承了原型对象还是对象,不知道该叫什么对象,打快了就变成子对象了~~~
      

  7.   

    核心提示:
    关键问题是楼主对:作用域问题和phtotype的用法以及类概念这三个问题理解不够深刻造成的;分析如下:
    根据楼主想要的结果:实例化哪个就输出哪个;但结果正好相反,都输出全部结果了,why?!!
    你的意思是想把实例化的参数保存到一个数组中,然后输出之,但因为上面相关问题理解不够,对问题的把握不够,程序当然“我行我素”输出结果了;先来看看正确的结果:
    关键是把数组的定义放到p的内部(即类内部),这时相当于给类p定义了一个类变量,只不过这个变量是数组类型,该变量的作用域仅限在类内部,定义的方法是this.items=new Array(); 而不能是this.prototype.items=new Array();也不能是p.prototype.items=new Array();后面两种都错误,
    ------------------------------------------------------
     <script type="text/javascript">
    //正确的代码如下
        var p=function(items){
            this.items=new Array();    //这里是核心问题,用数组类型变量做类变量
            for(var i=0;i<items.length;i++){
                this.items.push(items[i]);
            }
        }
        //p.prototype.items=new Array();
        var p1 = new p(["p1","p2"]);
        var p2 = new p(["p3"]);
        alert(p2.items);
      </script>
    -------------------------------------------------------
    以上是你想要的结果,任意你实例化哪个就输出哪个,决不多出另外一个,听话得很...呵呵...
    在来看看错误的原因:原因是prototype使用不当造成的,当你在类p外面定义个这个:
    p.prototype.items=new Array();
    你本意是想把定义的数组作为p的内部变量,但错了!这时定义的数组items它是一个独立的,在作用域方面来讲相当于和类p是同一个级别的,即p是定义了一个数据类型(即类原形),而items是一个变量,两个相互独立,只不过p和items通过关键字prototype连接起来,仅仅让类p把结果存储到该(外面的)数组items中而已,这好象相互独立的工厂A和物流公司的仓库一样,工厂A生产出来的产品,出货时先借用外面的物流仓库存储一样,然后再装上飞机或轮船;这个时候:
    p.prototype.items=new Array(); 和 var items=new Array();(p外定义) 可以说上没有区别的(当然类p内保存到数组的操作做响应的变化);按这样思路,当在p内部定义了this.items=new Array();即使p外面的定义的 p.prototype.items=new Array(); 没有注释掉,该类p也可以正确工作,由此可以看出类p外面定义的那个数组有没有都没关系,是相互独立的;prototype 主要用在类继承问题上,通过它可以对另一个对象的引用,更多关于prototype请上网搜索看看...回答是否清楚, 呵呵...可以加分不?....^=^
      

  8.   

    嘿呀,谢谢大家昨晚上在刚发此贴后自己就找到问题所在了,所以就没太多关注这贴子。
    没想到大家这样踊跃,感谢大家。正如楼上的朋友所说的:我对作用域问题和phtotype的用法以及类概念这三个问题理解不够深刻。