一、原型链
ES规定,每一个函数都有一个 prototype 属性,这个属性指向构造器的原型对象。原型对象会自动获得一个构造函数(constructor),在这个构造函数里也有一个指针指向prototype属性所在的函数,即constructor也指向这个函数。
1.构造器原型(prototype)
prototype是函数具有的一个属性,这个属性指向的是对应的原型对象。
prototype(原型对象)上的所有属性和方法都会被构造函数的实例化的实例对象继承,可以把那些公有的、需要复用的方法和属性(公有的),直接定义在 prototype 指向的原型对象上。
原型对象中的 this 依然指向实例化后对应的实例对象,原型对象中的构造函数(constructor)里面的 this 也指向实例对象。
2.内置原型(proto)
每一个实例对象上都有一个隐身原型(proto),这个属性同样指向一个原型对象。但是在JS中是没有这个定义的,但是大部分浏览器都能解析出这个属性,并指向与构造函数一样的prototype。
概念:实例对象与原型对象(prototype)之间的连接,叫做原型链,原型链依靠proto进行连接。
每个实例对象都拥有一个proto属性,原型链上的对象正是依靠这个属性链接。
3.原型链上的属性和方法是链式继承,也就是处于最顶层的原型的属性和方法会依次向下继承给所有处于这个链条上的对象。
原型链第一层:Object.prototype 原型链第二层:构造函数.prototype 原型链第三层:构造函数(实例对象)当一个实例对象想要使用属性和方法时,会首先在构造它的构造函数中寻找属性和方法,如果没有找到就跟着原型链向构造函数的原型中寻找,如果还是没找到就会去Object.prototype中寻找,如果在这里也没有找到那么就会报错,因为这里就是原型链的终点了。
如果将属性和方法绑定在Object.prototype原型上面,所有的对象都可以通过原型链去访问。
一般原型链的层级
构造函数 -> 构造函数的原型 -> Object.prototype二.根据原型链划分对象的等级
1.Object.prototype
2.Object类 Function类
检测级别的属性:instanceof(判断一个对象是否是一个构造函数或者类的实例,输出布尔值)
console.log(Object instanceof Function); //true 对象是函数构造的
console.log(Function instanceof Object); //true 函数属于对象,一切皆对象