说不尽的函数-原型链(续)
2011-04-01 00:00 Feather 阅读(228) 评论(0) 收藏 举报在几个月之前,我笔记过一篇《说不尽的函数-原型链》的文章,时隔多月,温故之。上次本来打算画一个原型链的图出来,但是一直没有画,这几天下载了一堆UML软件,发现这些软件都图形丑陋而且喜欢自作聪明。于是还是用Photoshop画出来了。
下面是原型链的重温过程。
上篇文章说到,所有实例对象都有一个__proto__属性,它们都指向其构造函数的prototype属性,而所有构造函数本身就是Function构造函数的一个实例。
有实验有真相:
Function Book(){}
var book=new Book();
alert(book.__proto__==Book.prototype);//true
alert(Book.__proto__==Function.prototype);//true
下面我是继续沿着链探索一下,Function对象的__proto__会是什么呢?
输出一下就知道:
alert(Function.__proto__);//输出:Function Empty(){}
可以看到结果是一个函数对象,一看到函数,我就想到它有prototype属性,看到对象,我就想到它有__proto__属性了,看来真没完没了了。
但是,例外出现了,这个函数对象没有prototype属性,输出为undefined;还有的是,__proto__属性依然存在。
剩下最后一个问题了,Function.__proto__.__proto__是什么?还有Book.prototype.__proto__和Function.prototype.__proto__又是什么呢?
还是用一开始的那句话,实例对象的__proto__属性指向构造函数的prototype属性。Book.prototype和Function.prototype是谁构造的?
我做了一个猜想,它们其实就是一个简简单单,普普通通的对象,它们是由Object构造的。
有实验有真相:
alert(Function.__proto__.__proto__==Object.prototype);//输出:true
alert(Book.prototype.__proto__==Object.prototype);//输出:true
alert(Book.prototype.__proto__==Object.prototype);//输出:true
兜兜转转了一圈,都会到一个地方了。故事还没有完,按照上面说,Object.prototype也是一个对象吖,那么它的__proto__是指向自身么?
有实验有真相:
alert(Object.prototype.__proto__);//输出null
拉扯了这么就,终于把整条链子条理清楚了。但是估计我下次看的时候会很头晕,于是乎,我用PS画了一副图,便于更好地理解。

浙公网安备 33010602011771号