1、原型链
var A = function A(){
var i = 1;
}
var a = new A();
console.log(a.__proto__); // 即构造器function A的原型对象,也是一个对象所以也有__proto__对象
console.log(a.__proto__.__proto__); // 即构造器function object的原型对象
console.log(a.__proto__.__proto__.__proto__); // null


从上图可以看出,实例就是对象,本例子中,a就是实例,A是构造函数,实例是通过new一个构造函数生成的。 实例的__protpo__指向的是原型对象。
那什么是原型链呢?
简单理解就是原型组成的链,对象的__proto__它的是原型,而原型也是一个对象,也有__proto__属性,原型的__proto__又是原型的原型,就这样可以一直通过__proto__想上找,这就是原型链,当向上找直到找到Object的原型的时候,这条原型链就算到头了。
实例和原型链之间的关系
通过一个构造函数创建出来的多个实例,如果都要添加一个方法,给每个实例去添加并不是一个明智的选择。这时就该用上原型了。 在实例的原型上添加一个方法,这个原型的所有实例便都有了这个方法。
var A = function A(){
var i = 1;
}
var a = new A();
var b = new A();
a.__proto__.say = function(){
console.log("hello");
}
a.say();
b.say();
按照JS引擎的分析方式,在访问一个实例的属性的时候,现在实例本身中找,如果没找到就去它的原型中找,还没找到就再往上找,直到找到。这就是原型链。
and
只有函数有prototype,对象是没有的。
但是函数也是有__proto__的,因为函数也是对象。函数的__proto__指向的是Function.prototype。
也就是说普通函数是Function这个构造函数的一个实例。