原型与原型链
看了很多的文章讲原型和原型链,不外乎讲一堆例子,或者用一堆图来视图让我明白这是怎么一回事,但事实上,我越看越困惑。所以我尽量尝试不去用复杂的例子和逻辑来说明这个问题。
首先声明一个对象obj,obj里有一个__proto__,它指向Object.prototype,所以我们可以看到obj.__proto__ === Object.prototype // true; 对象有__proto__,函数有的是prototype。
我们只针对这个简单的例子来理解,也就是说var 对象 = 函数(),对象.__proto__ === 对象的构造函数.prototype,事实上这个__proto__是由浏览器生成的,假如我们有一条线的话,那这条线由“对象.__proto__” 指向 “对象的构造函数.prototype”,这样我们可以直接调用proto里面的属性。
为什么会这样呢? 首先我们得知道什么是共有属性,就像每个对象都可以调用自己的toString,但那样每个对象都要写toString,所以浏览器为了节省内存,只给每个生成的对象一个__proto__,并给__proto__一个可以访问到共有属性prototype的地址,大家都通过__proto__的地址去访问prototype里面的属性。
这些共有属性构成的对象就叫做原型,由“对象.__proto__”指向 “对象的构造函数.prototype”,“对象的构造函数.prototype的__proto__”指向“null”的这条线,就是原型链。