JavaScript是如何管理prototype属性及嵌套的原型构造器链的?
JavaScript管理constructor-prototype循环链条的核心逻辑
你观察到的所谓「无限嵌套链条」本质是对象间的循环引用,而非真实的多层嵌套生成新对象,JS引擎完全不需要处理无限嵌套的问题,具体逻辑如下:
- 所有的
constructor和prototype属性存储的都是内存指针,指向已经存在的对象,不是每次访问时动态生成的新嵌套对象。
举最常见的空对象例子:
你通过{}创建的普通空对象,内部__proto__直接指向引擎初始化阶段就提前创建好的全局单例Object.prototype;Object.prototype的constructor属性指向同样是全局单例的Object构造函数;而Object构造函数的prototype属性又指向之前的Object.prototype,全程就是两个固定对象互相持有对方的引用,没有额外的嵌套对象生成。 - 自定义构造函数的逻辑完全一致:你定义
function Custom() {}时,引擎会自动生成一个Custom.prototype对象,同时给这个对象添加constructor属性指向Custom函数本身,Custom函数的prototype属性指向生成的Custom.prototype,还是两个对象互相引用,没有嵌套。
你可以通过下面的代码验证这一点,全等判断返回true就说明来回访问时指向的都是同一个已存在的对象:
const emptyObj = {} // 不管来回访问多少次constructor和prototype,都是同一个对象 console.log(emptyObj.constructor.prototype.constructor === emptyObj.constructor) // true console.log(emptyObj.constructor.prototype === Object.prototype) // true
简单总结:你看到的「链条」只是在两个固定对象之间来回跳转的指针指向,根本不存在无限嵌套的实体对象,自然不会有内存溢出或者管理难度的问题。
内容的提问来源于stack exchange,提问作者Khalid Alluhybi
相关产品推荐
相关产品推荐

