javascript的几种继承方法

来源:互联网 发布:mysql统计不重复数据 编辑:程序博客网 时间:2024/06/16 22:53

1、原型链

原理:利用原型让一个引用类型继承另外一个引用类型的属性和方法。

构造函数,原型,实例之间的关系:每个构造函数都有一个原型对象,原型对象包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。

原型链实现继承例子:

function SuperType() {this.property = true;}SuperType.prototype.getSuperValue = function() {return this.property;}function SubType() {this.property = false;}//继承了SuperTypeSubType.prototype = new SuperType();SubType.prototype.getSubValue = function (){return this.property;}var instance = new SubType();console.log(instance.getSuperValue());//true
2、借用构造函数

原理:在子类型构造函数的内部调用超类构造函数,通过使用call()和apply()方法可以在新创建的对象上执行构造函数。

function SuperType(){this.colors=["red","blue","green"];}function SubType(){SuperType.call(this);}var instance1=new SubType();instance1.colors.push("black");console.log(instance1.colors);var instance2=new SubType();console.log(instance2.colors);

3、组合继承

原理::将原型链和借用构造函数的技术组合在一块,从而发挥两者之长的一种继承模式。

 function SuperType(name){ this.name=name; this.colors=["red","blue","green"]; } SuperType.prototype.sayName=function(){ console.log(this.name); } function SubType(name,age){ SuperType.call(this,name); this.age=age; } //继承方法 SubType.prototype=new SuperType(); SubType.prototype.constructor=SubType; SubType.prototype.sayAge=function(){ console.log(this.age); } var instance1=new SubType("EvanChen",18); instance1.colors.push("black"); console.log(instance1.colors); instance1.sayName(); instance1.sayAge(); var instance2=new SubType("EvanChen666",20); console.log(instance2.colors); instance2.sayName(); instance2.sayAge();
4、原型链继承

原理:借助原型可以基于已有的对象创建新对象,同时还不必须因此创建自定义的类型。

var person={ name:"EvanChen", friends:["Shelby","Court","Van"] }; var anotherPerson=Object.create(person); anotherPerson.name="Greg"; anotherPerson.friends.push("Rob"); var yetAnotherPerson=Object.create(person); yetAnotherPerson.name="Linda"; yetAnotherPerson.friends.push("Barbie"); console.log(person.friends);

5、寄生式继承

原理:创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真正是它做了所有工作一样返回对象

 function createAnother(original){  var clone=Object(original);  clone.sayHi=function(){  alert("hi");  };  return clone;  }  var person={  name:"EvanChen",  friends:["Shelby","Court","Van"]  };  var anotherPerson=createAnother(person);  anotherPerson.sayHi();

6、寄生组合式继承

原理:通过借用函数来继承属性,通过原型链的混成形式来继承方法

  function inheritProperty(subType, superType) {var prototype = object(superType.prototype);//创建对象prototype.constructor = subType;//增强对象subType.prototype = prototype;//指定对象  }  function SuperType(name){this.name = name;this.colors = ["red","blue","green"];  }SuperType.prototype.sayName = function (){alert(this.name);};function SubType(name,age){SuperType.call(this,name);this.age = age;}inheritProperty(SubType,SuperType);SubType.prototype.sayAge = function() {alert(this.age);}