-2

每当我将任何javascript 对象登录到浏览器时,我都热衷于通过扩展控制台窗口中的内容来探索它,例如

console.log(console);

我确实找到了里面的东西,但是真正的查询现在开始了,当我展开对象时,它有一个名为__proto__的属性及其子属性,然后它又具有构造函数的属性,并且循环继续进行,因为它有__proto__和再等等。

它结束了吗?

如果,这个多次重复表示什么?

如果,为什么浏览器不挂起打印这样的无限对象?

  • 任何线索高度赞赏

感谢和问候肖希尔·塞西亚

4

1 回答 1

0

如果是,这个多次重复表示什么?

Derek 已经给了你一个解释原型链的链接。

如果否,为什么浏览器不挂起打印这样的无限对象?

__proto__是特殊属性,会以特殊方式处理。相反,让我们举一个通用的例子:

var a = {
  nest : function() {
    this.b = this; 
  }
}

a.nest();

这将创建一个具有指向主对象本身a的属性的对象。ba

如果这样做console.log(a),您将看到与在__proto__. 您可以继续扩展属性bN 次,它总是会显示一个具有属性b和方法的对象nest

在这种情况下,浏览器不会挂起,因为它只迭代一级属性。当您尝试扩展属性b时,它将再次仅迭代 1 级子属性。它从不迭代嵌套属性,因此不会遇到任何问题。另一方面,如果您尝试使用JSON.stringify(a)它将给出有关循环引用的错误,因为要从对象生成字符串,它必须迭代所有嵌套属性。

于 2017-07-21T03:31:15.080 回答