You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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函数的作用是收集对象所有自身属性(包括不可枚举的)以及原型链上所有层级的属性:
    1. 用while循环沿着原型链往上走,直到碰到null(这是所有对象原型链的终点)。
    2. 每次循环用Object.getOwnPropertyNames()获取当前对象的所有自身属性——注意这个方法和for...in不同,它会返回不可枚举的属性,而for...in默认只遍历可枚举属性。
    3. 把当前对象的属性合并到结果数组后,再把遍历目标切换为当前对象的原型,继续循环。

如果你有具体的困惑点(比如为什么某些属性没出现在结果里、循环终止条件的意义、和其他枚举方法的区别等),可以再详细说,我再针对性解答~

二、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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:02:33