2011-12-15 27 views
4

我尝试,得到了以下的输出:什么是“document.writeln(Object.prototype);”在JavaScript打印?

[目标对象]

我所熟悉的增加新的功能,Object.prototype中,以使程序中的每个对象继承了新的功能。但我有点好奇,知道这是如何实施的。我猜测类型

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

我还猜测Object.prototype中应该是关键的对象属性中的一个和该属性的值的对象应是“[对象的对象]”。现在,请让我知道我的理解是否正确?

我也在想''object'和'object'在'[object Object]'之间有什么区别。我也想知道上面提到的任何对象是否与之前的'.prototype'有关。你能澄清一下吗?当我试图打印Object.prototype.object,Object.prototype.Object,Object.prototype [object],Object.prototype [Object]和Object.prototype [0]时,我总是不确定。如果原型没有任何属性,我怎么得到[object Object]?

回答

3

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.2 Object.prototype.toString ()#ⓉⒺⓇ

当调用toString方法时,采取以下步骤:

  1. 如果此值未定义,则返回"[object Undefined]"
  2. 如果此值为空,则返回"[object Null]"
  3. 设O为调用ToObject将结果作为参数传递。
  4. 设类是O.
  5. 返回字符串值是串联的三根弦"[object ",阶级和"]"的结果[[Class]]内部属性的值。

内部属性有点混乱。您可以在8.6.2上阅读:

本规范使用各种内部属性来定义对象值的语义。这些内部属性不是ECMAScript语言的一部分。这些规范纯粹是为了说明目的而定义的。 ECMAScript的实现必须按照这里描述的方式生成和操作内部属性。内部属性的名称用双方括号括起来[[]]

顺便提及,Object.prototype.toString.call诀窍是在其isArray功能,因为内部属性使用jQuery和其他库是对所有帧中的相同,尽管每个帧具有其自身的内置Array的版本。

+0

谢谢迈克。突然之间,一切都清晰可见。感谢您对ec5.github.com的参考。神奇的参考。 – 2011-12-15 16:02:58

相关问题