JavaScript想实现继承的目的:重复利用另外一个对象的属性和方法
1.原型链继承
将父类(Person)的实例(p对象)作为子类(Student)的原型prototype。
优点
1.父类本身的方法/属性和prototype里面的属性和方法,子类都能够访问。
2.原型链继承简单易于实现。
缺点
1.父类的属性(父类本身或者prototype里面的)被所有子类实例共享。所有子类的实例都使用同一个属性。
2.因为无法向父类构造函数传参数,子类的实例没有办法使用父类的实例属性。(有,但是是公用的)
image.png
2.组合借用构造函数继承
在子类构造函数内部使用call方法,向构造继承可以向父类传递参数,即复制父类本身的属性和方法给子类。
缺点:1.借用构造函数继承最大的问题就是无论在什么情况下,都会调用两次父类构造函数。
第一次是在创建父类的实例,也就是子类的prototype的时候,第二次是在子类构造函数内部,也就是每次创建子类实例的时候。
2.所有的子类实例会拥有两份父类的属性。
一份在当前的实例自己里面(也就是stu1本身的),另一份在子类对应的原型对象中(也就是stu1.proto里面),里面都有age,friends,name属性; 当然,这两份属性我们无需担心访问出现问题,因为默认一定是访问实例本身这一部分的;
3 寄生组合式继承
使用了call函数和原型链。
不再使用父类的实例作为子类的prototype。而是创建出一个空对象,作为子类的prototype,但是这个空对象的proto是指向父类的prototype。
放弃使用父类的实例作为子类的prototype是因为我们在子类中使用了call这个函数,就意味着我们将父类中的属性和方法复制到了一份在子类实例中。所以父类本身里面的内容,我们不再使用。我们就只考虑怎么使用父类prototype中的方法就可以了。
网友评论