JS中的继承问题
在JS初期不存在继承
所谓的继承是强类型语言中的一种概念,指父类将本身的属性继承给子类,子类能够间接应用继承来的属性。
JS之所以不能继承是因为JS中不存在类的概念
原型是JS中用来实现继承的办法
原型的初识
原型就是 对象.__proto__
原型是对象的一个属性 叫做__proto__,这个属性无需开发者本人写入,每一个对象创立进去后,默认就会领有
原型的特点:原型是一个对象
原型中的属性会原原本本的继承给对象
对象能够应用原型中的所有属性,然而原型的属性不是对象的属性
每一个对象都有其对应的构造函数
对象的原型获取其构造函数的办法:constructor
构造函数也有一个属性,这个属性能够获取到构建函数创立进去的对象的原型prototype
构造函数:构造函数中的所有属性会齐全继承给对象,这些属性就是对象本身的属性
原型:原型中的属性也会继承给对象,然而这些属性不是对象本身的,而是原型的,对象只是可能应用
JS中实现继承的办法
构造函数继承:灵便,不便,能够一次性创立多个对象
原型继承:原型的继承会将原型中的所有属性继承给对象,然而这些属性值不能灵便的扭转
混合式继承
构造函数和原型独特实现继承
规定:构造函数继承常常须要扭转值的属性
原型继承属性值不须要扭转的属性
原型链
JS中原型也是对象,因而也会有__proto__属性指向本人的原型,这样在对象的原型,原型和原型的原型之间就会有一个由__proto__
原型链的终点:以后的对象
原型的起点:object.prototype (null)
数组对象的原型链
数组->Array.prototype-->Object.prototype-->null
函数的原型链(函数能够用 var a = new Function(){}形式申明)
函数-->Function.prototype-->Object.prototype-->null
Date对象原型链
Date对象-->Date.prototype-->Object.prototype-->null
查看Math原型链
原型链的作用:也是用来实现属性的继承的
例如数组对象,各种办法都写在了原型中,尽管申明的数组没有任何属性办法,然而能够调用
对象的属性查找准则
当一个对象调用属性的时候,会当初以后对象中查找,如果有,就间接应用,如果没有,就在对象的原型中查找,如果有就应用,如果没有就持续向更高一级的原型查找,直到找到Object.prototype,如果有就用,如果还没有,就返回undefined
重点:由属性查找准则可知,在开发过程中不要调用对象没有的属性,因为会有查找对象的整个原型链,十分节约性能