手机版

在JavaScript中解析instanceof对于不同的构造函数可能会返回true

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

我们知道instanceof运算符用于检查对象是否是构造函数的实例。以下是它返回真的一些场景。1.如果对象obj是新的Constructor创建的,那么Constructor的obj instanceof的复制代码为true,代码如下:函数person (n,a) {this。名称=n;this . age=a;} var p=new Person('约翰巴科斯',82);控制台日志(个人实例);//true 2。如果存在继承关系,父类的子类实例instance也将返回true。复制代码如下: function a(){ } function b(){ } b . prototype=new a();//B继承自A var B=new B();控制台日志;//true 3。由于对象是根类,所有其他用户定义的类都从它继承,因此任何构造函数的对象实例都返回true。复制代码如下:函数A(){ } var A=new A();控制台日志(对象的实例);//true var str=new String(' hello ');对象的字符串实例;//true var num=new Number(1);控制台日志(对象的实例数);//true甚至包括构造函数本身复制的代码如下:function a () {} console.log(对象的一个实例);//true console.log(对象的字符串实例);//true console.log(对象的实例数);//true 4。函数的所有构造函数实例都返回真。复制代码如下: function a(){ } console . log(function的一个实例);//true console.log(函数的字符串实例);//true console.log(函数的数字实例);//true以上四点可以用一句话来概括:如果一个实例是由一个类或者它的子类创建的,instanceof返回true。或者构造函数的原型存在于对象obj的内部原型链中,则返回true。也就是说,instanceof的结果与构造函数本身没有直接关系。这在许多语言中都很常见。在Java中定义了一个类Person,对于Person和Object,实例p都返回true。复制代码如下:类人{公共字符串名;公共信息时代;Person (String n,int a){ this . name=name;this . age=a;} public static void main(String[]args){ Person p=new Person('约翰巴科斯',82);System.out.println(以人为例);//true system . out . println(p instance of Object);//true}}如果Java中存在继承关系,父类的子类实例instance也返回true。复制代码如下://父类类Person { public String name公共信息时代;Person (String n,int a){ name=name;年龄=a;} }//子类公开课man extend person { public string university;Man(String n,int a,String s) { super(n,a);大学=s;} public static void main(String[]args){ Man mm=new Man(' John Resig ',29,' PKU ');System.out.println(以Man为例);//true system . out . println(mm instance of Person);//也是真的}}知道了这一点,JS中的如下表现就不足为奇了://定义两个构造函数:函数a () {}函数b(){ } a . prototype=b . prototype={ a : 1 };//创建两个不同构造函数的实例var A=new A();var b=新B();console . log(B的一个实例);//true console . log(A的b实例);//true我们可以看到A和B分别是用A和B创建的,但是B的A实例和A的B实例都是true。也就是说,虽然a不是用构造函数b创建的,但它仍然返回true。b .原型存在于a的内部原型链中。由于JS的动态语言特性,原型可以在运行时修改,所以下面返回false也就不足为奇了。因为A.prototype不再在A的内部原型链中,所以这个链就断了。复制代码如下:函数A(){ } var A=new A();a . prototype={ };//动态修改原型,注意A创建后的console.log(a的一个实例);//false注意,这篇文章也打破了上面总结的第一篇文章:对象obj是由新的Constructor创建的,因此obj instanceof Constructor为true。事实上,在ECMAScript标准中(以5.1为准),instanceof的内部实现会调用构造函数的内部方法[[HasInstance]],描述如下

如果F是一个函数对象,当F(V)被执行时,会发生以下步骤:1。如果instanceof的左操作数v不是对象类型,将直接返回false。复制代码如下:var a,b=1,c=true,d=' hello控制台日志(对象的实例);//这里的false,一个值是未定义的console.log(对象的b实例);//false console.log(对象的c实例);//false console.log(对象的d实例);//false 2/3。以构造函数f的prototype属性为例,如果它不是一个对象类型,则必须引发TypeError异常。复制代码如下: function a(){ } a . prototype=1;//的原型设置为非对象类型var A=new A();控制台日志;不同浏览器抛出的异常提示不同,火狐18:

chrome 24:

safari 6:

操作12:

第十届国际环境会议:

4.不断执行以下逻辑:将V设置为内部原型的V,如果V为空则返回false,如果V和O都指向同一个对象则返回true。

版权声明:在JavaScript中解析instanceof对于不同的构造函数可能会返回true是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。