Javascript 为什么数字从Object.prototype继承时不是Object的实例?
请参阅下面的代码片段Javascript 为什么数字从Object.prototype继承时不是Object的实例?,javascript,object,ecmascript-6,Javascript,Object,Ecmascript 6,请参阅下面的代码片段 设num=3; Object.prototype.prop=“某物”; log(对象的num instanceof)//错误的 console.log(num.hasOwnProperty('prop'))//false console.log(num.prop)/'something'数字是,因此它们不是从对象继承的,也不是任何东西的实例 但是,当您尝试访问属性(例如,方法)时,Javascript会将一个数字框到一个对象中,因此此属性访问实际上是在动态创建的numbe
设num=3;
Object.prototype.prop=“某物”;
log(对象的num instanceof)//错误的
console.log(num.hasOwnProperty('prop'))//false
console.log(num.prop)/'something'
数字是,因此它们不是从对象继承的,也不是任何东西的实例
但是,当您尝试访问属性(例如,方法)时,Javascript会将一个数字框到一个对象中,因此此属性访问实际上是在动态创建的number
对象上进行的。就像你做的那样:
console.log((new Number(num)).constructor.name);
console.log((new Number(num)).hasOwnProperty('prop'));
console.log((new Number(num)).prop):
<代码> PROP>代码>将在<代码>编号对象的原型链中找到,但是<代码> HasObjysAs/Cuth>——顾名思义——不看原型链,因此不会考虑您在“代码>对象上所做的事情。原型< /COD> < /P>
请注意,如果不尝试访问属性,则不会发生此静默装箱,因此在
num instanceof
中,将考虑原语,而不是它的Number
变体
通过调用toSource
方法,您实际上可以看到该装箱的跟踪:
设num=5;
log(num.toSource())
只有实际对象才能将其实例解析为true
。请参见
实例上的
,它指向:
当使用值V调用F的[[HasInstance]]内部方法时,将执行以下步骤:
如果V不是对象,则返回false
数字甚至不是数字的实例:
console.log(1个instanceof Number)代码>:
hasOwnProperty()
方法返回一个布尔值,指示对象是否将指定的属性作为自己的属性(,而不是继承它)
重点矿山
数字继承属性,因此您可以访问它,但它没有定义为数字本身的属性,这就是为什么hasOwnProperty(“prop”)
返回false的原因
instanceof
失败的原因是它只能用于显式对象(构造的或文本)。谢谢您的回答。但问题是为什么num.prop
从Object.prototype
获取值,那么num
是什么?它还是一个物体吗?根据Docs的说法,JavaScript中几乎所有对象都是Object
@Maheer的实例,这可能会有所帮助。“当您试图访问某个属性时,Javascript会将一个数字框到一个数字对象中”。我认为这就是整个问题的答案。请您提供规范中的任何参考。添加了参考。还值得注意的是,当使用严格模式时,type of this
在Number.prototype
函数的上下文中,将是“Number”而不是“object”。我有一个类似的老问题,描述了不同之处,也许它有一些额外的信息。