js几种继承模式(传统,call/apply,共享原型,圣杯模式)

1传统模式——原型链

Father.prototype.name="deng"

function Father(){

}

var father=new Father()
var son=new Father()

father.name //deng

son.name //deng

过多的继承了没用的属性。
2、借用构造函数 call、apply

function Person(name,age){
this.name=name;
this.age=age;
}
var person=new Person('zhangsan',15);
var obj1={}
Person.call(obj1,'wangmazi',29)
console.log(obj1)  //{name: "wangmazi", age: 29}

  不能继承借用的构造函数的原型

  多执行一个函数

   3.共享原型

  function Father(){}

   function Son(){}

   Father.prototype.lastName = 'deng';
   Son.prototype = Father.prototype;

   var son = new Son();

  son.lastName //'deng'

   不能随便改动自己的原型,因为指向同一个空间。

 4.圣杯模式    基于共享原型的基础上增加一个中间层

  

function Father(){}
function Son(){}
Father.prototype.lastName = 'qin';

var extend = (function(){
var Mid = function(){}
return function (Target, Origin){
Mid.prototype = Origin.prototype;
Target.prototype = new Mid();
Target.prototype.constructor = Target
}
}())

extend(Son, Father);
var son = new Son();

 

Son.prototype.firstName="333"   给Son的原型上添加属性不影响Father的原型

原文地址:https://www.cnblogs.com/h5it/p/12750107.html