js面向对象之继承

继承

继承:继承就是不劳而获。

js是生来继承的。它的继承就是通过原型链来实现的。

根据创建对象的方式不一样,则实现继承的方式也不一样。

创建对象有两种方法:
字面量方式 。这就是直接创建对象来了。
构造器+原型的方式。这个要new一下。

1. 对于字面量方式创建的对象的继承

js面向对象之继承

1. 浅拷贝

创建一个小王,让小王能够去拥有老王的属性
基本的思路,创建一个对象 ,把老王的属性全部复制一份
任务:把一个对象完整的复制一份

js面向对象之继承
js面向对象之继承
js面向对象之继承
下面在继承的基础上进行创新:
让xiaowang去结交新朋友:
js面向对象之继承
但是,我们发现,小王的朋友多了一个,影响了老王的朋友

js面向对象之继承
原因是:friends是一个引用数据类型,它的值分成两个部分保存,js面向对象之继承
循环中的赋值只是传递的栈区的地址 ,而导致两个对象共用一个friends。js面向对象之继承
解决办法:深拷贝

  1. 深拷贝 – 递归(掌握)js面向对象之继承
    js面向对象之继承
    js面向对象之继承
    js面向对象之继承

2. 构造器+原型的方式 继承(了解)

1. 创建一个构造器NBAPlayerjs面向对象之继承

这个构造器用来创建普通的,所有的NBAPlayer。

现在,我们希望在普通的nbaplayer的基础,添加一类新的球员:MVP球员。

希望来创建一个构造器,专门生产MVP球员。

但这个构造器与NBAPlayer之间是有关系的:MVP是NBAPlayer中比较特殊的一类:如果你一个mvp,则一定是一个NBAPlayer。

这里就涉及继承的问题。

下面完全重写代码:
js面向对象之继承
发现,MVP和NBAPlayer这两个构造器有很地方是重复的。所以可以继承一下。

2. 继承属性js面向对象之继承

js面向对象之继承
通过call来实现属性的继承:

NBAPlayer.call(this,name,age,height)会做两件事:
(1)用这里的this去代替函数NBAPlayer中的this。具体来说,这里的this就是p1。
(2)要执行NBAPlayer这个函数。会给this对象加属性,而这里的this又被改成了p1,所以导致属性都加在了p1上面。

3. 继承方法

js面向对象之继承
浅拷贝继承方法
js面向对象之继承
js面向对象之继承
11.3. Object.create继承(了解)

从一个现有对象,进行继承,得到一个全新的对象 ,但这个新对象可以去访问旧对象的所有的属性和方法。
js面向对象之继承

继承的原理是:原型链

父对象js面向对象之继承

子对象js面向对象之继承
子对象的隐式原型 === 父对象。js面向对象之继承