## 一、原型
> 1.所有`引用类型`都有一个`__proto__(隐式原型)`属性,属性值是一个普通的对象
> 2.所有`函数`都有一个`prototype(原型)`属性,属性值是一个普通的对象
> 3.所有`引用类型的__proto__`属性`指向`它`构造函数的prototype`
```
var a = [1,2,3,4,5,6];
a.__proto__ === Array.prototype; // true
```
## 二、原型链
> 当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的`__proto__`隐式原型上查找,即它的构造函数的`prototype`,如果还没有找到就会再在构造函数的`prototype`的`__proto__`中查找,这样一层一层向上查找就会形成一个链式结构,我们称为`原型链`。
举例,有以下代码
```
function Parent(month){
this.month = month;
}
var child = new Parent('dong');
console.log(child.month); // dong
console.log(child.year); // undefined
```
在child中查找某个属性时,会`执行下面步骤`:
![这里写图片描述](https://upload-images.jianshu.io/upload_images/6946912-339f149a0c766118?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
`访问链路`为:
![这里写图片描述](https://upload-images.jianshu.io/upload_images/6946912-3d21506b44030989?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
> ①一直往上层查找,直到到null还没有找到,则返回`undefined`
> ②`Object.prototype.__proto__ === null`
> ③所有从原型或更高级原型中的得到、执行的方法,其中的this在执行时,指向当前这个触发事件执行的对象