JavaScript继承

构造函数式继承函数

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
相关文章
相关标签/搜索