先来看一个实例
Foo.__proto__结果如下:
Foo.prototype结果如下:
实例说明了:
1、 foo
是 Foo
的一个实例,不是一个函数,所以没有prototype
;
Foo
是Function
的一个实例,而Function
是一个函数,他的实例Foo
也是一个函数,所以他们都有prototype
。此外Object Array RegExp
等也是函数。Math
就仅仅是一个new Object()
,不是函数。
2、构造函数的prototype,默认情况下就是一个new Object()
还额外添加了一个constructor
属性。所以说默认是没有prototype
只有__proto__
的。
除了Object.prototype
这个对象,其他所有的对象都会有__proto__
属性,之后函数才会有prototype
属性。
在创建对象的时候会自动创建一个__proto__
属性,指向它构造函数的prototype
,当访问这个对象的属性的时候会顺带访问__proto__
中对应的属性,也就是构造函数prototype
这样实现了继承。
只有创建函数的时候才会创建一个prototype
属性,目的就是为了完成上面的继承方式。
总结:
<1>不管是普通对象还是函数对象,它们都有一个隐含属性”__proto__ “,而这属性就是我们通常说的原型(属性),它其实就是一个Object类型的对象。
<2>对于函数对象,它们还会多一个prototype的属性,它和以它为构造函数创建的普通对象的”__proto__ “属性等同,即"new XXXt().__proto__ ===XXX.prototype"为true,即对象XXX中都有__proto__属性就是一个指针,指向XXX构造函数中的prototype属性。
<3>
<4>
<5>
摘录网上
一个图(橙色箭头是初始的关系,绿色是执行 var Fish = new Fu... 创建,蓝色是执行f1= new Fish()
创建。)
这样f1
就可以通过__proto__
访问 Fish.prototype
中的属性(当然这是程序执行的时候自动查找的)。Fish就可以访问 Function.prototype定义的属性。所有对象都可以访问Object.prototype
中的属性。