今天主要讲解一下Object和Function的原型链关系图,这个主要就是当你使用instanceof的时候,内部会沿着__proto__向上查找,如果找到了,返回true,否则false。因此我们要稍微理清一下__proto__的关系图。

background Layer 1 Instances Functions Propertys function Foo() var f1=new Foo(); Foo.prototype prototype construct construct __proto__ function Object() var o1=new Object(); Object.prototype prototype construct construct function Function() var Foo=new Function(); Function.prototype prototype construct construct __proto__ __proto__ __proto__ __proto__ __proto__ __proto__ null __proto__ 等同 1 2 3 4 5 6 7

注:上图中的function Foo()代表所有通过new Function()的实例,说白了就是代表方法(类),如Date,RegExp等,它们的typeof都是function。

我们看一个最简单的instanceof:

这个很简单,大家肯定都知道这个结果是正确的,由此我们可以找出一般规律:

background Layer 1 如果a instanceOf b成立,那么满足: a.__proto__.__proto__........(1个或者多个__proto__)==b.prototype

我们可以发现这个最简单的例子就是上图中的➀,即f1.__proto__==Foo.prototype。

好,我们已经知道大概知道一点了,下面我们讲解一些例子,看如何利用上图来解释一些复杂的instanceof:

(1)Function instanceof Object

Function.__proto__.__proto__==Object.property,就是上图中的➆➄。

(2)Object instanceof Function

Object.__proto__==Function.prototype,上图中的➅。

(3)Function instanceof Function

Function.__proto__=Function.prototype,上图中的➆。

现在来个实例的:function Foo(){};var f=new Foo();

(4)Foo instanceof Object

Foo.__proto__.__proto__==Object.property,上图中的➂➄。

(5)Foo instanceof Function

Foo.__proto__==Function.prototype,上图中的➂。

(6)f instance of Object

f.__proto__.__proto__==Object.prototype。上图中的➀➃。

大家考虑一下f instanceof Function是否成立呢?为什么?

(7)f.constructor==Foo.prototype.constructor。(都是指向Foo。)

其他文章

0
我要评论

评论

返回
×

我要评论

回复:

昵称:(昵称不超过20个字)

图片:

提交
还可以输入500个字