一开始没有东西只有一个null
然后无中生有产生了一个模板(No1)然后根据模板创建一个对象 Object 所以Object.prototype === No1 所以Object.prototype.proto === null.使用这个对象(机器)Object可以生产各种的对象,只需要通过new但是有一天,因为Object什么都可以生产,生产的对象太杂,为了实现物以类聚,使用特定的机器生产特定的对象,于是创建了String Number Boolean机器来创建不同的对象。和Object一样,这些机器也需要各自有一个模板对象,也就是它们的prototype属性指向的那个对象。显然它们的模板对象应该是继承自No. 1对象的又有一天,造物者发现,这些机器本质起来也还是一个对象,于是创建了一个机器的祖先,为了方便把这些机器都管理起来。它来表示所有机器的共同特征,换句话说,把它作为所有机器的原型对象。这时候造物者发现,每次创建机器都要我创建,我能不能创建一个创建机器的机器呢?于是它创建了Function,有了Function机器后,就可以实现自动化地制造机器了。首先,Function首先是一台机器,所以他的原型对象是No2对象其次,Function又是一台制造机器的机器,所以它的模板也是No.2对象所以:Function.proto === Function.prototype所有的函数(包括Function)的原型都是No. 2对象,而同时Function.prototype也是No. 2对象。这说明了:从逻辑上,我们可以认为所有机器(包括Function自己)都是由Function制造出来的。还有就是 Object作为一个机器可以看做是有由Function制造出来的,而Function作为一个对象可以看做是由Object制造出来的。实例对象的__proto__ === 构造函数的prototype这就是JavaScript世界的“鸡生蛋,蛋生鸡”问题。那么到底是谁生了谁呢?Whatever!机器可以作为这类对象的标志,即面向对象语言中类(class)的概念。所以机器又被称为构造函数最终的样子:
原型链继承:每个构造函数(constructor)都有一个原型对象(prototype),原型对象都包含一个指向构造函数的指针,而实例对象(instance)都包含一个指向原型对象的内部指针.JS对象的圈子里有这么个游戏规则:如果试图引用对象(实例instance)的某个属性,会首先在对象内部寻找该属性,直至找不到,然后才在该对象的原型(instance.prototype)里去找这个属性.