一、传统形式 -->原型链
缺点:像下面这个案例,如果我只是需要lastName这个属性,那么还会继承到name这个属性,浪费空间。
1 Grand.prototype.lastName = "Y"; 2 function Grand(){}; 3 Father.prototype = Grand; 4 function Father(){ 5 this.name = 'Father'; 6 }; 7 Son.prototype = Father; 8 function Son(){}; 9 let son = new Son();View Code
二:借用构造函数
缺点:借用别人的构造函数对象,但是原型还是使用我们自己的,等于只是调用了它的方法,视觉上虽然省了代码,但是该执行还是得执行。
1 function Person(name,sex,age){ 2 this.name = name 3 this.sex = sex; 4 this.age = age; 5 } 6 function Student(name,sex,age,grade){ 7 Person.call(this,name,sex,grade); 8 /* 9 相当于 10 this.name = name; 11 this.sex = sex; 12 this.age = age; 13 */ 14 15 this.grade = grade; 16 }View Code
三、共享原型
缺点:如果其中一个修改了原型,那么另外一个也会受到干扰。
Father.prototype.lastName = "Y"; function Father(){}; function Son(){}; Son.prototype = Father.prototype; //若执行下面这一条,那么Father.prototype.lastName 也会相应发生改变 Son.prototype.lastName = 'Son';View Code
四:圣杯模式
function inherit(Target,Orgin){ function F(){}; F.prototype = Orgin.prototype; Target.prototype = Orgin.prototype; Target.prototype.constructor = Target; Target.prototype.uber = Orgin.prototype;//uber相当于supre,利用这个查询最终继承谁 } Father.prototype.lastName = 'Y'; function Father(){}; function Son(){};View Code
五:总结
传统继承形式:原型链,会过多继承没用的属性,浪费空间。
借用构造函数:不能继承借用构造函数的原型,每次创建一个对象都要多执行一次
共享性☆☆☆☆☆☆:不能随便更改自己的原型,否则会影响继承/被继承的原型。
圣杯模式☆☆☆☆☆☆:继承或者非继承对象修改自己的原型,不会影响另外一个的原型。