JS高级和面向对象

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
重点:由属性查找原则可知,在开发过程中不要调用对象没有的属性,因为会有查找对象的整个原型链,非常浪费性能

你可能感兴趣的:(javascript)