内置Object构造函数的底层实现结构是怎样的?
你的草图方向没错,不过内置Object构造函数的结构可以拆成两个明确的部分:直接挂在Object本身的静态成员,以及所有对象实例都会继承的原型成员,下面给你理清楚细节:
一、Object构造函数的静态成员
这些方法/属性直接通过Object.xxx调用,是构造函数自身的功能:
Object.create():创建新对象,以传入的对象作为新对象的原型Object.defineProperty():给对象定义单个新属性,或修改已有属性的配置Object.defineProperties():一次性给对象定义多个属性Object.entries():返回对象自身所有可枚举属性的键值对数组Object.freeze():完全冻结对象,禁止任何修改操作(包括添加、删除、修改属性)Object.fromEntries():把键值对数组转换为对应的对象Object.getOwnPropertyDescriptor():获取对象指定属性的详细描述(比如是否可枚举、是否可修改等)Object.getOwnPropertyDescriptors():获取对象所有自身属性的描述信息Object.getOwnPropertyNames():返回对象自身所有非Symbol类型的属性名数组Object.getOwnPropertySymbols():返回对象自身所有Symbol类型的属性数组Object.getPrototypeOf():获取对象的原型(即[[Prototype]]内部属性)Object.is():精准判断两个值是否为同一个值(比===更严格,比如能区分NaN和NaN、+0和-0)Object.isExtensible():检查对象是否还能添加新属性Object.isFrozen():检查对象是否已经被冻结Object.isSealed():检查对象是否被密封(不能添加/删除属性,但可修改现有属性的值)Object.keys():返回对象自身所有可枚举的非Symbol属性名数组Object.preventExtensions():禁止对象再添加新属性Object.seal():密封对象,限制添加和删除属性的操作Object.setPrototypeOf():设置对象的原型Object.values():返回对象自身所有可枚举属性的值数组- 补充你草图里没覆盖的常用静态方法:
Object.assign():把一个或多个源对象的可枚举属性复制到目标对象Object.hasOwn():判断对象自身是否包含指定属性(是Object.prototype.hasOwnProperty的安全替代)
二、Object.prototype上的原型成员
所有通过new Object()、字面量{}创建的空对象,都会通过原型链继承这些方法:
constructor:指向构造函数Object本身propertyIsEnumerable():检查指定属性是否是对象自身的可枚举属性toLocaleString():返回对象的本地化字符串表示(不同对象会有自定义实现,比如日期对象)toString():返回对象的字符串表示(默认是[object Object],其他类型对象会重写这个方法)valueOf():返回对象对应的原始值(比如数组的valueOf()返回数组本身,日期对象返回时间戳)- 补充你草图里遗漏的关键原型方法:
hasOwnProperty():判断对象自身是否包含指定属性(注意:不要直接在未知对象上调用obj.hasOwnProperty(),可能被对象自身的同名属性覆盖,建议用Object.hasOwn()替代)isPrototypeOf():判断当前对象是否是另一个对象的原型toStringTag:一个只读属性,用于自定义toString()返回的类型标签(比如数组的toString()返回[object Array],这里的Array就来自Array.prototype[Symbol.toStringTag])
需要注意的是,内置Object构造函数是JavaScript引擎原生实现的,并不是像你写的那样用普通JS函数定义的,但从API层面,上面的结构就是它对外暴露的完整成员。
内容的提问来源于stack exchange,提问作者lgTakunda
相关产品推荐
相关产品推荐

