一、ES5实现继承
原型链的核心只需要记住三点:
- 每个
实例对象
都有__proto__属性,该属性指向其构造函数的原型对象
,在调用实例的方法和属性时,如果在实例对象上找不到,就会往原型对象上找。 - 构造函数的prototype属性也指向实例的原型对象
- 原型对象的constructor属性指向构造函数。
①原型链继承:
原型链继承的原理很简单,直接让子类的原型对象指向父类实例
,当子类实例找不到对应的属性和方法时,就会往它的原型对象,也就是父类实例上找,从而实现对父类的属性和方法的继承。
// 父类
function Parent() {
this.name = '29'
}
// 父类的原型方法
Parent.prototype.getName = function() {
return this.name
}
// 子类
function Child() {
}
// 让子类的原型对象指向父类实例, 这样一来在Child实例中找不到的属性和方法就会到原型对象(父类实例)上寻找
Child.prototype = new Parent()
Child.prototype.constructor = Child // 根据原型链的规则,顺便绑定一下constructor, 这一步不影响继承, 只是在用到constructor时会需要
// 然后Child实例就能访问到父类及其原型上的name属性和getName()方法
const child = new Child()
child.name // '29'
child.getName() // '29'
原型继承的缺点:
由于所有Child实例的隐式原型都指向同一个Parent实例, 因此对某个Child实例的
父类引用类型变量
修改会影响所有的Child实例
在创建子类实例时无法向父类构造传参, 即没有实现super()的功能
// 示例:
function Parent() {
this.name = ['29kun']
}
Parent.prototype.getName = function() {
return this.name
}
function Child() {
}
Child.prototype = new Parent()
Chil