很多方法库里面都有判断对象是否是PlainObject的方法,下面是看到的一个比较简单判断PlainObject对象的方法:

这个方法就是在原型链一直往上找,找到null以下的原型对象proto,然后判断obj的原型链是不是proto。

上面的说法比较绕,我们看看我们之前画过一个Object,Function的原型关系图,看图就一清二楚了(Object.getPrototypeOf相当于__proto__):

background Layer 1 Instances Functions Propertys function Foo() var f1=new Foo(); Foo.prototype __proto__ function Object() var o1=new Object(); Object.prototype function Function() var Foo=new Function(); Function.prototype __proto__ __proto__ __proto__ __proto__ __proto__ __proto__ null __proto__ 等同

我们可以发现,沿着原型链不管怎么走,null下的总是Object.prototype,既然如此,为什么不直接Object.getPrototypeOf(obj) === Object.prototype这样写?因为while循环就是为了找到Object.prototype,为啥不直接写而要要个弯子?

iframe导致内外执行环境不同

这样设计就是为了避免iframe嵌入导致的执行环境不一样的问题,下面我们看个demo:

上面的有一个页面,内嵌了iframe,iframe中调用外部的定义好的方法,关键代码如下:

本来正常情况下['aaa'] instanceof Array返回的肯定是true,但是这里为什么是false?

因为iframe和外部有两套执行环境,都有Object,Array,Date...,相互之间是平行的,在原型链上没有关系。大致关系如下:

background Layer 1 Object Array Date ... 外部环境 Object Array Date ... iframe环境 ['aaa'] 没关系 有关系

因为someFunction是在外面被调用的,因此在iframe内部产生的['aaa']和外部的Array没有任何关系。为了避免执行环境的差异,因此Object.prototye不能直接使用,而是要沿着当前的原型链去找,即使麻烦,但不会出错。

其他文章

0
我要评论

评论

返回
×

我要评论

回复:

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

图片:

提交
还可以输入500个字