javascript继承

原型之间的关系是继承的基础
首先最重要的一点是Javascript中所有的对象都是Object的实例,并继承Object.prototype的属性和方法.(Object.prototype最高,再往上找是Null了)

(用console.dir看原型,可进行检验)

重点:prototype与__proto__的区别
在对象创建时会有一些预定义的属性,其中定义函数时,这个预定义属性就是prototype,定义普通对象时,就会生成一个__proto__,,这个__proto__指向的是这个对象的构造函数的prototype。
比如说,构造了一个函数B,b是实例(b是对象,只有__proto__属性),那么b.proto==B.prototype答案是true
注:把构造函数当成对象叫时用__proto__;而对构造函数中的多个对象时,用prototype。
User.prototype.proto=Object.prototype =>true
User.prototype.constructor=User =>true

in不只检测对象还检测原型链;而hasOwnProperty只检测当前对象
(key用法:key打印属性大名,a[key]打印内容)

this始终指向调用其所在属性的对象

继承
原型的继承而不是改变构造函数的原型
常见六种继承方式
1.原型链继承
重点:让新实例的原型等于父类的实例
CHILD.prototype = new PARENT();
CHILD.prototype.constructor = CHILD;
setPrototypeOf(a,b) 人为设置(getPrototypeOf获取)
b是a的原型(父级),a能够继承b的所有属性
1.png
2.借用构造函数继承
重点:使用call()和apply()将父类构造函数引入子类函数
apply:应用某一对象的一个方法,用另一个对象替换当前对象。
call:调用一个对象的一个方法,以另一个对象替换当前对象。
注:apply最多两个参数,要是很多个数据的话,需要写在[]数组中
call正常,,的写就行
2.png
3.组合继承(原型链+构造函数)(最常用)
重点:结合了两种模式的优点,传参和复用
3.png
4.原型式继承–Object.create
重点:用一个函数包装一个对象,然后返回这个函数的调用,这个函数就变成了个可以随意增添属性的实例或对象。
var B = Object.create(A)以A为原型创建了B
这种方法只接收两种参数
(1)用作新对象原型的对象
(2)为新对象定义额外属性的对象
Object.create(OBJ)创建一个空对象,让空对象的__proto__指向OBJ
重定向的同时不要忘记写B.prototype.constructor=B
4.png
5.寄生式继承
重点:给原型式继承外面套了一层
5.png
6.寄生组合式继承(常用)
重点:修复了组合继承的问题
6.png
7.ES6中的class继承
class CHILD extends PARENT{}{
//如果写constructor,则constructor中的第一句话必须是super()
super()=>A.call(this)
}
1.png