prototype据我所知,用处主要有两种:
1、prototype属性使您有能力向对象添加属性和方法。
<script type="text/javascript"> function employee(name,job,born) { this.name=name; this.job=job; this.born=born; } employee.prototype.salary=20000; employee.prototype.getName= function() { alert("Name:"+this.name) }; var bill=new employee("Bill Gates","Engineer",1985); alert("salary:"+bill.salary); bill.getName(); </script>
本例就通过prototype属性向employee这个类中添加了一个属性salary和方法getName(),网页加载后弹出bill的salary和name。
2、prototype实现继承
部分转载自http://www.cnblogs.com/goody9807/archive/2007/04/16/715109.html
首先看示例1,使用prototype属性继承了父类的属性a
<script type="text/javascript"> function ClassA() { this.a='a'; } function ClassB() { this.b='b'; } ClassB.prototype=new ClassA(); var objB1=new ClassB(); alert(objB1.a); </script>
ClassB继承了ClassA的属性,网页加载后弹出“a”;
示例2,当父类属性是String,Number和Boolean等简单类型时,子类修改父类的属性,彼此不受影响
当父类属性是Array和Object类型时,子类修改父类的属性,会导致所有继承的子类属性全部发生变化
这是因为对于简单类型,prototype是值拷贝,而对于复杂类型,则是引用地址拷贝。
<script type="text/javascript"> function ClassA() { this.a='a'; this.array1=[]; } function ClassB() { this.b='b'; } ClassB.prototype=new ClassA(); var objB1=new ClassB(); var objB2=new ClassB(); //修改父类string类型 objB1.a='!!!'; alert(objB1.a); alert(objB2.a); //修改父类array类型 objB1.array1.push(1,2,3); alert(objB1.array1); alert(objB2.array1); </script>
网页加载后依次弹出"!!!", “a”, “1,2,3”, “1,2,3”
objB1和objB2中的array1对象都引用的是classA中的array1对象,因此一个改变,会同步影响另一个。