一、原型
1、原型是什么
首先给出定义:给其它对象提供共享属性的对象,简称为原型( prototype )。
所有对象,都有一个隐式原型 __proto__ 属性,属性值是一个普通的对象,它被称之为这个对象的 prototype 原型。当访问对对象的某个属性时,会先在对象本身的属性上寻找,没找到就会去他的原型对象上寻找。
__proto__ & constructor 概念简介
- proto:隐式原型,js标准里对象的原型无法直接通过属性名访问,但是多数浏览实现了
__proto__(注意前后都有两个下划线)属性用来访问对象的原型。 - constructor:构造器,创建一个函数时会为它增加一个 prototype 属性,指向原型对象,原型对象自动获得一个名为 constructor 的属性,指回与之关联的构造函数。
2. 原型的作用
原型在Javascript中是一个非常重要的概念,那么它有什么作用呢?
作用在定义中已经提到了:共享属性
如果在一个对象上找不到某个属性,就会去它的原型对象上找,以此类推直至找到,或者寻找到原型链的终点都没找到则不存在这个属性;这个特性让任意创建的对象都拥有通用的各种方法,例如:toString、hasOwnProperty、isPrototypeOf等
3. 原型的应用
共享属性的特性可以用来做很多巧妙的事情。
3.1 属性委托
普通对象上的默认方法都是来自于 Object.prototype 上的方法
二、原型链
什么是原型链
定义:如果要访问对象中并不存在的一个属性,就会查找对象内部 prototype 关联的对象。在查找属性时会对它进行层层寻找遍历,这个关联关系实际上定义了一条原型链。
原型链最终会指向Object.prototype,原型链的终点是Object.prototype.__proto__ 也就是 null。