<body> <script type="text/javascript"> function Animal (name){ this.name=name; this.type="animal"; } Animal.prototype={ say:function(){ alert("I'm a(an) "+this.type+", my name is "+this.name); } } function Bird(name){ Animal.call(this,name); } Bird.prototype=Animal.prototype; Bird.prototype.fly=function(){ alert("I'm flying"); } var myBird=new Bird("feimos"); myBird.say();//I'm a(an) animal , my name is feimos myBird.fly();//I'm flying var myDog=new Animal("aHuang"); myDog.fly();//I'm flying </script> </body>
<body> <script type="text/javascript"> var a=10; var b=a; var c=[1,2,3]; var d=c; b++; d.push(4); alert(a);//10 alert(b);//11 alert(c);//1,2,3,4 变量c和d指向同一份数据,数据变更会互相影响 alert(d);//1,2,3,4 </script> </body>
<body> <script type="text/javascript"> var a=[1,2,3]; var b={name:"feimos",sex:"male",tel:"1234567"}; var c=[],d={}; for(var p in a){ c[p]=a[p]; } for(var p in b){ d[p]=b[p]; } c.push(4); d.email="xxx@gmail.com"; alert(a);//1,2,3 alert(c);//1,2,3,4 alert(b.email);//undefined alert(d.email);//xxx@gmail.com </script> </body>
对于数组的传值,我们还可以使用数组类的slice或concat方法实现:
1 2 3 4 5 6 7 8 9
<script type="text/javascript"> var a=[1,2,3]; var b=a.slice(),c=a.concat(); b.pop(); c.push(4); alert(a);//1,2,3 alert(b);//1,2 alert(c);//1,2,3,4 </script>
prototype本质上也是一个hash对象,所以直接用它赋值时会进行传址,这也是为什么myDog会fly的原因。我们可以用for in 来遍历prototype,从而实现prototype的传值。但是因为prototype和function的关系,我们还有另一种方法实现prototype的传值——new SomeFunction():
<script type="text/javascript"> function Animal(anme){ this.name=name; this.type="animal"; } Animal.prototype={ say:function(){ alert("I'm a(an) "+this.type+" , my name is "+this.name); } } function Bird(name){ Animal.call(this,name); } Bird.prototype=new Animal(); Bird.prototype.constructor=Bird; Bird.prototype.fly=function(){ alert("I'm flying"); } var myBird=new Bird("feimos"); myBird.say();//I'm a(an) animal , my name is feimos myBird.fly();//I'm flying var myDog=new Animal("aHuang"); myDog.fly();//报错 </script>