继承的理解
什么是继承:子类可以引用父类的所有方法和属性但是父类不能引用子类的属性和方法--这种单向引用叫做继承--继承是从上往下单向进行的,每个下级都可以引用上级的属性,并且可以自定义自己特有的属性或者改变上级的属性(这种改变不是通用的)
继承的意义
怎么实现继承:核心就是1)让子类的原型对象的原型属性(__proto__) 指向 父类的原型对象 2)在子类内部运行父类改变this指向,从而将父类的属性和方法写入子类
这样就实现了:1)每个子类的实例都能拥有“独立”的父类属性和方法,不会相互干扰--子类继承了父类的属性和方法
2)父类的原型改变时(增删新的方法或属性),子类也可以获得改变的状态---子类继承了父类原型的属性和方法(这种改变时
所有后代同步改变的)
3)子类的可以在Child.prototype上添加只属于子类的属性和方法,而不会影响父类-也就是说实现了子类可以引用父类的所有方法和属性
但是父类不能引用子类的属性和方法,单向的传递即继承!
具体流程如下:
function Parent(){ this.a = 'a'; } function Child(){ //在子类内部运行父类,改变this指向,使子类继承父类的属性和方法 Parent.call(this); this.b = 'b'; } //将子类原型对象的原型属性指向父类的原型对象,从而使子类继承父类原型中的属性和方法 Child.prototype.__proto__ = Parent.prototype; child = new Child(); parent = new Parent(); Parent.prototype.getName = function(){ return 'Hello World'; } console.log(child.a,child.b) Child.prototype.getAge = function(){ return 18; } console.log(child.getAge()); //18 console.log(parent.getAge); //undefined--父类不可以访问子类原型
ps:上面的
Child.prototype.__proto__ = Parent.prototype;
经常被写成
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
为啥要这么麻烦的写,比较疑惑