对象
无非两种编程思路(面向过程、面向对象),js虽然弱类型语言但是他也是个万物皆对象的面向对象编程语言。
- 类:具有相同的属性与方法的一类对象的抽象(一组对象的集合,一个大类目)
- 实例:某一类其中的一个对象(new对象、实例化对象…)
- 对象:具有属性与方法的具体的事物
- 比如:类:汽车这个类
class car
,创建实例:new一个对象let Cadillac = new car()
,这里这个凯迪拉克就是一个对象
了解以上知识后我们来了解下原型
首先什么是原型呢?
- 我是这么理解的(原型就好比我们复印件的原件)
原型链继承:
- 所有对象都会有一个__proto__的属性,对象的这个自带的属性可以是你向上追溯,他会指向他构造函数的原型
new function().__proto__ == function.prototype
。就好比拿着打印件第二版去找第一版,然后找到原件一样。最顶部是object() 该对象的原型 - 每个函数实例都会存在一个prototype的方法,他可以通过prototype找到该函数的原型
- 这个原型有什么作用呢? 你在原型上添加的方法,他的所有实例都可以使用(也就是说你在object对象上添加方法的所有的对象都可以获取到哦)
- 原型链继承其实就是两个函数实例,让其中一个函数的原型去等于另一个函数实例,这样操作的话就相当于得到了该函数原型上的所有方法
- 缺陷:如果是引用类型的数据:其中一个子实例进行修改之后也会影响到其他子实例,基本属性是不会出现这样的问题的
- 所以大部分情况都是:基本属性 + 方法,将属性封装在构造函数中、将方法定义在原型对象上
总结:
原型链我理解就是一个数据链路,通过条线把有关联的数据串起来,一个构造函数拥有prototype可以找到该构造函数的原型,该构造函数的实例可以通过__proto__找到他的构造函数的原型,只有函数才有原型,而原型属于一个对象,他会存在__proto__属性,可以一直向上追溯,源头是object对象的原型。而原型链继承就相当于,一个函数在自己的原型上添加了另一个函数,那样他就拥有的该函数的方法盒属性(原型上的所有方法与属性,该函数的子实例都可以调用)