什么是“document.writeln(Object.prototype);”在javascript打印?

时间:2011-12-15 14:11:24

标签: javascript

我尝试了以下输出:

[object Object]

我熟悉向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]时,我总是未定义。如果原型没有任何属性,我怎么得到[object Object]?

1 个答案:

答案 0 :(得分: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.   
  3. 如果此值为null,则返回"[object Null]"
  4.   
  5. 设O是调用 ToObject 传递此值作为参数的结果。
  6.   
  7. 让class为O的<{1}}内部属性的值。
  8.   
  9. 返回串联三个字符串[[Class]],类和"[object "的结果的字符串值。
  10.   

内部属性有点令人困惑。您可以在8.6.2

上阅读它们
  

此规范使用各种内部属性来定义对象值的语义。这些内部属性不是ECMAScript语言的一部分。它们仅由出于说明目的而由本规范定义。 ECMAScript的实现必须表现得就像它以此处描述的方式在内部属性上生成和操作一样。内部属性的名称用双方括号"]" [[括起来。

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