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”。我有一个类似的老问题,描述了不同之处,也许它有一些额外的信息。