原型式继承,就是必定一个函数,该函数中建立一个临时性的构造函数,将做为参数,传入的对象做为这个构造函数的原型,最后返回这个构造函数的实例对象前端
/*定义函数:用于实现对象之间的继承 参数: obj:表示继承关系中的父级对象 prop:对象格式,表示继承关系中的子级对象的属性和方法 */ function fn(obj,porp){ //定义一个临时的构造函数 function Fun(){ //遍历对象的属性和方法 for(var attrName in porp){ this[attrName]=porp[attrName]; } } //将函数的参数做为构造函数的原型 Fun.prototype=obj; //将构造函数建立的对象进行返回 return new Fun(); } var obj={ name:'前端' } //调用函数 var result=fn(obj,{ age:20, sayMe:function(){ console.log('this is function'); } }); console.log(result.age); result.sayMe();
利用Object.create()方法实现继承app
var obj={ name:'前端' } var newObj=object.create(obj,{ age:{ value:20 }, sayMe:{ value:function(){ console.log('this is function'); } } }); console.log(newObj.age); newObj.sayMe();
不管是原型链仍是原型式继承,都具备相同的问题。想要解决这样的问题的话,能够借助构造函数(也能够叫作伪造对象或经典继承)。
这种方式实现很是简单,就是在子对象的构造函数中调用父对象的构造函数。具体能够经过调用apply()和call()方法实现。
apply()和call()方法都容许传递指定某个对象的this。对于继承来说,能够实如今子对象的构造函数中调用父对象的构造函数时,将子对象的this和父对象的this绑定在一块儿函数
//定义父级对象的构造函数 function Parent(){ this.parent='parent'; } //定义子级对象的构造函数 function child(){ //调用父级对象的构造函数:使用apply()或call()方法 Parent.call(this); this.child='child'; } //建立子级对象 var child=new Child(); console.log(child);
组合继承,也叫作伪经典继承,指的是将原型链或原型式继承和借助构造函数的技术组合在一块儿,发挥两者长处的一种继承方式
具体实现的思路就是:this
这样,既经过在原型上定义方法实现了函数的重用,又能够保证每一个对象都有本身的专有属性prototype
function Parent(){ //构造函数的自有属性 this.name='前端'; } //构造函数的原型属性 Parent.prototype.age=20; function Child(){ //继承父级构造函数中的自有属性 Parent.call(this); this.job='IT'; } //继承父级构造函数中的原型属性 Child.prototype=Parent.prototype; var child=new Child(); console.log(child.job); console.log(child.age); console.log(child.name);