【问题标题】:What does "document.writeln(Object.prototype);" in javascript print?“document.writeln(Object.prototype);”是什么意思在javascript打印中?
【发布时间】:2011-12-15 22:20:46
【问题描述】:

我尝试并得到以下输出:

[对象对象]

我熟悉向 Object.prototype 添加新函数,以便程序中的每个对象都继承该新函数。但我有点想知道这是如何实现的。我猜对象应该是类型

{
    name: expression,
    name: expression,
    ...
}

我还猜测 Object.prototype 应该是 Object 属性之一的键,并且该属性的值是“[object Object]”。现在请您告诉我我的理解是否正确?

我也想知道'[object Object]'中的'object'和'Object'有什么区别。我还想知道上述任何对象是否与前面的“.prototype”有关。请你澄清一下?

当我尝试打印 Object.prototype.object、Object.prototype.Object、Object.prototype[object]、Object.prototype[Object] 和 Object.prototype[0] 时,我总是无法定义。如果prototype没有任何属性,我是怎么得到[object Object]的?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    object 始终存在,Object 来自 [[Class]] 内部属性的值,这就是原因

    Object.prototype.toString.call([]) === "[object Array]";
    Object.prototype.toString.call("") === "[object String]";
    Object.prototype.toString.call(new Date) === "[object Date]";
    

    在15.2.4.2中有描述:

    15.2.4.2Object.prototype.toString ( )#ⓉⒺⓇ

    当toString方法被调用时,执行如下步骤:

    1. 如果此值未定义,则返回"[object Undefined]"。
    2. 如果this值为null,则返回"[object Null]"。
    3. 令 O 为调用 ToObject 并将 this 值作为参数传递的结果。
    4. 令 class 为 O 的 [[Class]] 内部属性的值。
    5. 返回字符串值,它是三个字符串"[object "、class 和"]" 连接的结果。

    内部属性有点混乱。你可以在8.6.2阅读它们:

    本规范使用各种内部属性来定义对象值的语义。这些内部属性不是 ECMAScript 语言的一部分。它们由本规范定义,纯粹是为了说明目的。 ECMAScript 的实现必须表现得好像它以此处描述的方式生成和操作内部属性。内部属性的名称用方括号括起来[[]]。

    顺便提一下,jQuery 和其他库在其 isArray 函数中使用了 Object.prototype.toString.call 技巧,因为所有帧的内部属性都是相同的,即使每个帧都有自己的 Array 内置版本。

    【讨论】:

    • 谢谢迈克。突然,一切都变得清晰起来。并感谢您对 ec5.github.com 的引用。很棒的参考。
    • @RajkumarMasaniayan,是的。在可搜索的 HTML 中拥有该规范非常好。相比之下,PDF 版本是 PITA。
    猜你喜欢
    • 2017-06-11
    • 2015-07-15
    • 2018-07-17
    • 1970-01-01
    • 2012-09-11
    • 2011-04-16
    • 2011-06-20
    • 2017-03-02
    • 2013-02-14
    相关资源
    最近更新 更多