浏览器控制台中的对象属性

Object Properties in Browser's Console

每当我将任何 javascript 对象 登录到 浏览器 时,我都热衷于通过扩展其中的内容来探索它控制台 window, 一个这样的例子是

console.log(console);

我确实找到了里面的东西,但真正的查询现在才开始, 当我展开对象时,它有一个名为 __proto__ 的 属性 及其内部的子属性,然后它又具有 属性 的 contructor 循环继续,因为它有 __proto__ 等等。

结束了吗?

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

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

感谢和问候 肖希尔塞西亚

If Yes, what does this multiple repetition denotes ?

Derek 已经给你一个link解释原型链。

If No, Why doesn't browser hangs on printing such infinite object ?

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

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

a.nest();

这将创建一个对象 a,它有一个指向主对象 a 本身的 属性 b

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

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