继承 <1>原型链 利用原型让一个引用类型继承另一个引用类型的属性和方法 function dad(){ this.prototype=true; } function son(){ this.sonprototype=false; } //继承dad son.prototype=new dad(); 原型链出现的问题:共享问题 function dad(){ this.colors=["red","blue","green"]; } function son(){ }; //继承 son.prototype=new dad(); var a =new son(); a.colors.push("black"); alert(a.colors); //"red,blue,green,black" var b=new son(); alert(b.colors); //"red,blue,green,black" <2>借用构造函数---------使用call和apply function dad(){ this.colors=["red","blue","green"]; } function son(){ //继承dad() dad.call(this); } var a =new son(); a.colors.push("black"); alert(a.colors); //"red,blue,green,black" var b=new son(); alert(b.colors); //"red,blue,green" 优点:可以传参数 function dad(name) { this.name=name; } function son(){ //继承 dad.call(this,"william"); //传参数 this.age=21; } var a=new son(); alert(a.name); //"william" alert(a.age); //21 缺点:方法都在构造函数中定义,函数没法复用 <3>组合继承 原型类:继承原型属性和方法 借用构造函数:继承实例属性 function dad(name){ this.name=name; this.colors=["red","blue","green"]; } dad.prototype.sayname=function(){ alert(this.name); }; //分号 function son(name,age) { //借用构造函数 //继承属性 dad.call(this, name); this.age = age; //继承方法 -------原型链 son.prototype = new dad(); son.prototype.constructor = son; son.prototype.sayage = function () { alert(this.age); } } var a=new son("cyc",20); a.colors.push("black"); alert(a.colors); //"red,blue,green,black" a.sayname(); //"cyc" a.sayage(); //20 var b=new son("william",21); alert(b.colors); //"red,blue,green" b.sayname(); //"william" b.sayage(); //21 <4>原型式继承 function object(o){ function F(){}; F.prototype=o; return new F(); } 在object()函数内部,先创建了一个临时性的构造函数, 然后将传入的对象作为整个构造函数的原型,最后返回了 整个临时类型的新实例 -------------example-------------- var person={ name:"william", friends:["cyc","aaa"] } var person1=object(person); person1.name="b"; person1.friends.push("bbb"); var person2=object(person); person2.name="c"; person2.friends.push("ccc"); alert(person.friends); //"cyc,aaa,bbb,ccc" <5>寄生式继承 function createAnother(original){ var clone=object(original); clone.sayHi=function(){ alert("hi"); } return clone; } <6>寄生组合式继承 function dad(name) { this.name=name; this.colors=["red","green"]; } dad.prototype.sayname=function(){ alert(this.name); } function son(name,age){ dad.call(this,name); //第二次调用dad() this.age=age; } son.prototype=new dad(); //第一次调用dad() son.prototype。constructor=son; son.prototype.sayage=function(){ alert(this.age); }