手机版

了解Javascript_07_了解instanceof的实现原理

时间:2021-10-22 来源:互联网 编辑:宝哥软件园 浏览:

那么实例的这种行为是如何实现的呢?现在让我们揭开实例背后的迷雾。按照实例原则的约定,我们先来看一段代码:复制代码如下: function cat(){ } cat . prototype={ } function dog(){ } dog . prototype={ } vardog 1=new dog();警报(狗的第一个实例);//真警报(对象的dog1实例);//真dog . prototype=cat . prototype;警报(狗的第一个实例);//假警报(Cat的dog1实例);//假警报(对象的dog1实例);//true;var Dog 2=new Dog();警报(狗的第二个实例);//真正的警报(Cat的dog2实例);//真警报(对象的dog2实例);//true dog . prototype=null;var Dog 3=new Dog();警报(卡特彼勒的dog3实例);//假警报(对象的dog3实例);//真正的警报(dog的dog3实例);//错误我们画个内存图来分析一下:

记忆图很复杂。说明程序本身是一个动态的概念,Dog.prototype会随着程序的执行而不断变化。但是为了方便,我只画了一幅图来表达原型参考的这三个变化。在堆中,右边是函数对象的内存表示,中间是函数对象原型属性的指向,左边是函数对象创建的对象实例。其中dog1、dog2和dog3写在指向原型属性的函数对象指针上,分别对应Dog.prototype的三个引用变化.它们与堆栈中的dog1、dog2、dog3也有对应关系。(注意:函数对象将在后续的博文中解释。)需要注意的一点是,如果dog3中的函数对象的prototype属性为null,那么函数对象实例dog3的内部[[prototype]]属性将指向Object.prototype,这在《理解Javascript_06_理解对象的创建过程》中进行了解释。结论根据代码运行结果和内存结构,得出检测一个对象A是否是另一个对象B的实例的原理是检查对象B的原型所指向的对象是否在对象A的[[prototype]]链中,如果存在则为真,如果不存在则为假。但是,有一种特殊情况,当对象b的原型为null时,将报告一个错误(类似于null指针异常)。我在这里推荐一篇文章,来源于岁月如歌,也是关于instanceof的原理。角度不一样,但效果一样。

版权声明:了解Javascript_07_了解instanceof的实现原理是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。