构造函数式继承函数
function Parent(n,walk){ this.name = n; } Parent.prototype.a = 'a'; function Child(name){ //子类继承父类name属性 Parent.call(this,name); } let baby = new Child('baby'); // baby baby.a; //undefined
构造函数缺点:子类没法继承父类原型对象上的属性,两个类的原型对象是相互独立的。子类只能继承构造函数挂载在实例上的属性;this
原型链继承
实现原理:将子类原型对象变为父类的实例,则能够继承它的原型对象,解决了构造函数的缺点prototype
function Parent(){} Parent.prototype.a = 'a'; Parent.prototype.array = [1,2,3]; function Child(){} Child.prototype = new Parent() (new Child()).__proto__ === new Parent(); //true // 子类实例的原型对象等于父类的实例,也就是说子类实际上等于父类的实例 (new Child()).__proto__.__protp__ === Parent.prototype //true //用过原型链继承,子类实例的原型(父类实例)的原型的对象等于父类的原型对象 Child.prototype.__proto__ === Parent.prototype //true //baby.__proto__.__proto__ = Parent.prototype 由此可知子类实例baby的原型的原型等于 父类的原型 let baby = new Child(); baby.__proto__ === Child.prototype //true baby.__proto__.__proto__ = Parent.prototype //true let anotherbaby = new Child(); baby.a;//a baby.array;// [1,2,3] anotherbaby.array.push(4); //由于baby和anotherbaby的原型都指向父类原型,因此当属性值为引用类型时一个修改了会影响另一个 baby.array // [1,2,3,4]
构造原型式继承
组合继承方式能够解决实例继承原型对象属性互相影响的问题code
function Parent(name){ this.name=name //引用类型不要放到原型对象上 this.arr = arr; } function Child(name){ //继承父类的构造函数 Parent.call(this,name,arr) } //用Object.create()接口从新建立一个和Parent.prototype同样的对象 let prototype = Object.create(Parent.peototype) //可是这时prototype.constructor = Parent的构造函数 须要改成Child prototype.constructor = Child //继承父类的原型对象 Child.prototye = prototype