JavaScript 继承方式的实现

 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;
原文地址:https://www.cnblogs.com/CHWYH/p/5444451.html