JS中创建对象与生成类实例在内存层面是否存在差异?
两种生成Person对象方式的内存差异与语法糖问题解答
一、内存层面的差异
- 函数返回对象的方式:每个生成的对象都是独立的普通对象,它们的原型链直接指向
Object.prototype,对象之间没有额外共享的自定义原型对象。 - 类实例化的方式:每个
new Person()生成的实例,原型链会先指向Person.prototype,再由Person.prototype指向Object.prototype。所有Person实例会共享Person.prototype这个对象。 - 实际差异:如果你的Person类没有在原型上定义任何方法或属性,
Person.prototype本身只是一个继承自Object的空对象,内存占用极小,两种方式的内存差异几乎可以忽略。但从理论结构上来说,类实例多了一层原型指向,确实存在微小的区别。
二、ES6类是不是语法糖?两种方式效果完全一致吗?
ES6的class确实是原型继承的语法糖,但这两种实现方式并非完全一致,核心区别如下:
- 构造调用限制:类的构造函数必须用
new调用,直接执行Person()会抛出错误;而getPerson()可以直接调用返回对象。 - 原型链与constructor指向:
- 类实例的
constructor属性指向Person构造函数; - 函数返回的对象(通过对象字面量创建),其
constructor属性指向Object。
- 类实例的
- 严格模式差异:类内部默认运行在严格模式下,而普通函数如果没有显式声明严格模式,内部会按非严格模式执行。
- 提升规则不同:函数声明可以被提升(在定义前调用也不会报错),而类声明不能被提升,必须先定义再实例化。
- 方法枚举性:如果给Person类的原型添加方法,这些方法默认是不可枚举的;但如果给普通函数的原型加方法,默认是可枚举的(你的例子未涉及此场景,但这是本质区别之一)。
内容的提问来源于stack exchange,提问作者Michael Vigato
相关产品推荐
相关产品推荐

