Object.getPrototypeOf()工作原理及MDN对象属性枚举示例疑问
解答你的JavaScript对象相关疑问
嗨!咱们一步步拆解你关于JavaScript对象的疑问:
一、关于"Enumerate the properties of an object"的示例代码解析
先把你提到的示例代码补全并整理一下(顺便纠正个小笔误:原文档里的Mushtag应该是Mustang哦):
var myCar = { make:'Ford', model:'Mustang', year:1969, } function listAllProperties(o) { var objectToInspect = o; var result = []; // 遍历原型链直到终点 while(objectToInspect !== null) { // 获取当前对象的所有自身属性(包括不可枚举的) result = result.concat(Object.getOwnPropertyNames(objectToInspect)); // 切换到当前对象的原型,继续遍历 objectToInspect = Object.getPrototypeOf(objectToInspect); } return result; }
这段代码的核心逻辑我给你拆解下:
myCar是一个普通的字面量对象,包含三个自身属性:make、model、year。末尾的逗号是尾逗号,ES5及之后的JS版本都支持,这种写法能让后续新增属性时更方便,不用特意补逗号。listAllProperties函数的作用是收集对象所有自身属性(包括不可枚举的)以及原型链上所有层级的属性:- 用
while循环沿着原型链往上走,直到碰到null(这是所有对象原型链的终点)。 - 每次循环用
Object.getOwnPropertyNames()获取当前对象的所有自身属性——注意这个方法和for...in不同,它会返回不可枚举的属性,而for...in默认只遍历可枚举属性。 - 把当前对象的属性合并到结果数组后,再把遍历目标切换为当前对象的原型,继续循环。
- 用
如果你有具体的困惑点(比如为什么某些属性没出现在结果里、循环终止条件的意义、和其他枚举方法的区别等),可以再详细说,我再针对性解答~
二、Object.getPrototypeOf()的工作原理
Object.getPrototypeOf()其实就是JavaScript里用来获取对象原型的标准方法,说直白点,它能拿到对象隐藏的[[Prototype]]内部属性指向的对象。
核心细节:
- 几乎所有JS对象都有一个隐藏的
[[Prototype]]属性,这个属性就是对象的“原型”,整个JS的继承体系都是靠这个属性串联起来的原型链实现的。 - 调用
Object.getPrototypeOf(obj)时,它会直接返回obj的[[Prototype]]指向的对象。举个例子:// 创建一个原型对象 const carPrototype = { wheels: 4 }; // 创建一个以carPrototype为原型的对象 const myCar = Object.create(carPrototype); // 验证原型关系 console.log(Object.getPrototypeOf(myCar) === carPrototype); // 输出 true - 如果你传入的不是对象(比如原始值像字符串、数字),在非严格模式下会自动把原始值装箱为对应的包装对象(比如字符串会转为
String对象),然后返回包装对象的原型;严格模式下则会直接报错。
常见用法:
- 检查一个对象是否继承自某个特定的原型。
- 遍历对象的整个原型链(就像上面的
listAllProperties函数那样)。 - 判断某个属性是对象自身拥有的,还是从原型链上继承来的。
内容的提问来源于stack exchange,提问作者user2860957
相关产品推荐
相关产品推荐

