每当我将任何javascript 对象登录到浏览器时,我都热衷于通过扩展控制台窗口中的内容来探索它,例如
console.log(console);
我确实找到了里面的东西,但是真正的查询现在开始了,当我展开对象时,它有一个名为__proto__的属性及其子属性,然后它又具有构造函数的属性,并且循环继续进行,因为它有__proto__和再等等。
它结束了吗?
如果是,这个多次重复表示什么?
如果否,为什么浏览器不挂起打印这样的无限对象?
- 任何线索高度赞赏
感谢和问候肖希尔·塞西亚
每当我将任何javascript 对象登录到浏览器时,我都热衷于通过扩展控制台窗口中的内容来探索它,例如
console.log(console);
我确实找到了里面的东西,但是真正的查询现在开始了,当我展开对象时,它有一个名为__proto__的属性及其子属性,然后它又具有构造函数的属性,并且循环继续进行,因为它有__proto__和再等等。
它结束了吗?
如果是,这个多次重复表示什么?
如果否,为什么浏览器不挂起打印这样的无限对象?
感谢和问候肖希尔·塞西亚
如果是,这个多次重复表示什么?
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)它将给出有关循环引用的错误,因为要从对象生成字符串,它必须迭代所有嵌套属性。