js面向对象之继承
继承
继承:继承就是不劳而获。
js是生来继承的。它的继承就是通过原型链来实现的。
根据创建对象的方式不一样,则实现继承的方式也不一样。
创建对象有两种方法:
字面量方式 。这就是直接创建对象来了。
构造器+原型的方式。这个要new一下。
1. 对于字面量方式创建的对象的继承
1. 浅拷贝
创建一个小王,让小王能够去拥有老王的属性
基本的思路,创建一个对象 ,把老王的属性全部复制一份
任务:把一个对象完整的复制一份
下面在继承的基础上进行创新:
让xiaowang去结交新朋友:
但是,我们发现,小王的朋友多了一个,影响了老王的朋友
原因是:friends是一个引用数据类型,它的值分成两个部分保存,
循环中的赋值只是传递的栈区的地址 ,而导致两个对象共用一个friends。
解决办法:深拷贝
- 深拷贝 – 递归(掌握)
2. 构造器+原型的方式 继承(了解)
1. 创建一个构造器NBAPlayer
这个构造器用来创建普通的,所有的NBAPlayer。
现在,我们希望在普通的nbaplayer的基础,添加一类新的球员:MVP球员。
希望来创建一个构造器,专门生产MVP球员。
但这个构造器与NBAPlayer之间是有关系的:MVP是NBAPlayer中比较特殊的一类:如果你一个mvp,则一定是一个NBAPlayer。
这里就涉及继承的问题。
下面完全重写代码:
发现,MVP和NBAPlayer这两个构造器有很地方是重复的。所以可以继承一下。
2. 继承属性
通过call来实现属性的继承:
NBAPlayer.call(this,name,age,height)会做两件事:
(1)用这里的this去代替函数NBAPlayer中的this。具体来说,这里的this就是p1。
(2)要执行NBAPlayer这个函数。会给this对象加属性,而这里的this又被改成了p1,所以导致属性都加在了p1上面。
3. 继承方法
浅拷贝继承方法
11.3. Object.create继承(了解)
从一个现有对象,进行继承,得到一个全新的对象 ,但这个新对象可以去访问旧对象的所有的属性和方法。
继承的原理是:原型链
父对象
子对象
子对象的隐式原型 === 父对象。