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();定义了一个属性,这个属性是共享的,子对象共享该属性,虽然无法修改这个属性,但是可以操作此属性
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();定义了一个属性,这个属性是共享的,子对象共享该属性,虽然无法修改这个属性,但是可以操作此属性
<!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>
<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>
楼上的,你试试alert(p1.items);
呵呵,俺的本职工作是java,继承了父类就是子类,javascript这里没有类的概念,继承了原型对象还是对象,不知道该叫什么对象,打快了就变成子对象了~~~
关键问题是楼主对:作用域问题和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请上网搜索看看...回答是否清楚, 呵呵...可以加分不?....^=^
没想到大家这样踊跃,感谢大家。正如楼上的朋友所说的:我对作用域问题和phtotype的用法以及类概念这三个问题理解不够深刻。