1 1、原型链继承 2 function superType(name){ 3 this.name= 'milk'; 4 } 5 super.prototype.sayName=function(){ 6 console.log(this.name); 7 } 8 function subType (age){ 9 this.age= 20; 10 } 11 subType.prototype=new superType();// 将原型对象等于另一个类型的实例 12 subType.prototype.getAge=function(){console.log(this.age)} 13 var instance = new subType(); 14 // 缺点:由于原型链共享的本质所引起的:对于 引用类型的数据共享问题;引用类型 数据会被所有实例共享;并且在创建子类型实例时,不能向超类型的构造函数中传递参数(应该说是 没有办法在不影响所有对象实例的情况下,给超类型的构造函数传参) 15 16 17 18 2、借用构造函数 19 20 function superType(name){ 21 this.name=name; 22 } 23 24 fucntion subType(){ 25 superType.call( this ,'milk'); 26 } 27 28 var instance= new subType(); 29 30 31 // 缺点:方法都在构造函数中定义,因此无法进行函数复用;并且超类型原型中定义的方法对子类型而言也是不可见的; 32 33 34 3、组合继承: 35 36 // 思想:通过借用构造函数来 实现实例属性的继承;使用 原型链实现原型属性和方法的继承 37 38 function superType(name){ 39 thism.name=name; 40 } 41 superType.prototype.sayName=function(){ 42 console.log(this.name); 43 } 44 45 fucntion subType(name,age){ 46 superType.call(this,name); 47 this.age=age; 48 } 49 50 subType.prototype= new superType(); 51 subType.prototype.constructor= subType; 52 subType.prototype.sayAge=function(){ 53 console.log(this.age); 54 } 55 56 var instance = new subType('milk',20); 57 58 // 缺点 :效率较低,需要调用两次超类型构造函数 59 60 4、原型式继承 61 62 不必创建自定义类型,只需借助已有对象创建新对象即可; 63 function object(o){ 64 function F(){}; 65 F.prototype = o; 66 return new F(); 67 } 68 ES5 新增了一个类似的函数: Object.create(obj,{}); 69 第一个参数:用作新对象(new F() )原型的对象; 70 第二个参数:为新对象定义额外属性的对象; 71 // 应注意:包含引用类型值得属性始终都会共享相应的值; 72 73 5、寄生式继承 74 // 基于已有对象创建一个新对象,增强新对象能力,并将新对象返回; 75 76 function creatAnther(original){ 77 var clone= object(original); 78 clone.saySN=function(){ 79 //do somethings 80 }; 81 return clone; 82 } 83 84 6、寄生组合式继承 85 // 由于组合继承 会调用两次 超类型的构造函数,所以 采用 寄生组合式继承从而节省 第一次调用; 86 // 思想:借用构造函数来继承属性,通过原型链的混成形式来继承方法; 87 本质上:使用 寄生式继承来继承超类型原型,然后再将结果指定给子类型的原型; 88 89 用:: 90 var prototype = object(superType.prototype);//创建超类型原型的副本;//相当于超类型的实例 91 prototype.constructor= subtype;// 弥补重写原型而丢失的constructor属性 92 subtype.prototype= prototype;// 将新创建的 对象复制给子类型的原型 93 替换:: 94 subType.prototype= new superType(); 95 subType.prototype.constructor= subType;