在JS初期不存在继承
所谓的继承是强类型语言中的一种概念,指父类将自身的属性继承给子类,子类能够直接使用继承来的属性。
JS之因此不能继承是由于JS中不存在类的概念
原型是JS中用来实现继承的方法数组
原型就是 对象.__proto__
原型是对象的一个属性 叫作__proto__,这个属性无需开发者本身写入,每个对象建立出来后,默认就会拥有
原型的特色:原型是一个对象
原型中的属性会原本来本的继承给对象
对象可使用原型中的全部属性,可是原型的属性不是对象的属性
每个对象都有其对应的构造函数
对象的原型获取其构造函数的方法:constructor
构造函数也有一个属性,这个属性能够获取到构建函数建立出来的对象的原型prototype
构造函数:构造函数中的全部属性会彻底继承给对象,这些属性就是对象自身的属性
原型:原型中的属性也会继承给对象,可是这些属性不是对象自身的,而是原型的,对象只是可以使用函数
构造函数继承:灵活,方便,能够一次性建立多个对象
原型继承:原型的继承会将原型中的全部属性继承给对象,可是这些属性值不能灵活的改变
混合式继承
构造函数和原型共同实现继承
规则:构造函数继承常常须要改变值的属性
原型继承属性值不须要改变的属性性能
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
重点:由属性查找原则可知,在开发过程当中不要调用对象没有的属性,由于会有查找对象的整个原型链,很是浪费性能prototype