请问以下两次检测对象constructor是否拥有属性名1的结果分别是什么?

发布时间 2023-11-10 18:30:23作者: 龙陌

请问以下两次检测对象constructor是否拥有属性名1的结果分别是什么?

1 in Object(1.0).constructor;
Number[1] = 123;
1 in Object(1.0).constructor;

false、true

实际上Object(1.0)就是将数字“1.0”封装成它对应的包装类的一个对象实例比如Number(1.0),所以目的是为了检测1是否在Number上。
一开始1并不在Number原型链上所以返回false,直到添加了“Number[1]”这个下标属性之后才让1处于Number的原型链上,也因此返回了true。

constructor 是构造函数属性。它是谁的属性?它是原型属性 prototype 所指向的那个对象的属性。

Object(1.0).constructor 的原型是 Number 对象。

Number 对象本身可作为构造函数,所以 Object(1.0).constructor 就是 Number 对象本身。

  1. 在浏览器控制可以看到 Object(1.0).constructor 的原型上的 constructor 属性指向的构造函数即 Number 对象 最初没有 属性 1 ;

  2. 通过 Object[key] = value; 形式给 constructor 对象添加 key = 1 属性,对应的 value = 123 ;

  3. 第二次 检测对象 constructor 时就有了属性 1 。

Object(1.0)相当于new Number(1.0),实例化了一个Number类型的对象,
这个对象的constructor,也就是Object(1.0).constructor
指向实例化这个对象的构造函数,也就是Number,
因此第一行1 in Object(1.0).constructor的意思是判断此时的Number构造函数里是否包含1这个属性,结果显然是false;
Number是构造函数,也是对象,是对象就能添加属性,第二行Number[1] = 123给Number添加了一个属性1,值为123,此时Number函数里就包含了属性1,因此第三行1 in Object(1.0).constructor结果为true.

Object(1)是把1转成包装数字对象1,它没有属性constructor,所以会去它的原型对象Number.prototype上去找所以结果是Number(){}