在 ES6 class 的构造器中必须先调用 super() 吗?为什么?
本题解析为什么派生类构造器必须先调用 super(),以及调用顺序对 this 绑定、字段初始化的影响。通过示例展示正确用法与错误边界。
对象与原型专题面试题第 1 页,显示第 1–35 题,共找到 35 道完整解析,可继续按分类、标签与关键词缩小范围。
按稳定语义路径排序
本题解析为什么派生类构造器必须先调用 super(),以及调用顺序对 this 绑定、字段初始化的影响。通过示例展示正确用法与错误边界。
围绕“在 class 类字段中箭头函数定义的实例方法相比原型方法有什么性能或功能差异”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕类字段箭头函数每次实例创建时都会生成新函数,导致多份实例方法内存开销,但可以在构造函数前捕获 this。
本文解释构造函数显式返回对象或原始值时 new 表达式的行为差异。通过代码演示对象覆盖新建实例、原始值被忽略的机制,并给出识别与利用该行为的判断方法,涵盖函数与 class 构造器的场景。
围绕“在 class 中定义私有字段的语法是什么?私有字段如何实现真正私有”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕使用 # 前缀声明,只能在类内部访问,通过严格词法作用域保证。
围绕“在 ES5 原型继承中,为什么要将子类的 prototype 设置为父类实例?Object.create 如何改进”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖设置 prototype 为父实例是基础,但会共享实例属性,且需要重置 constructor,Object.create 避免构造函数。
围绕“Object.preventExtensions() 后还能给对象新增属性吗?如何判断扩展性”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕禁止新增,但可删改旧属性;通过 Object.isExtensible 判断。
围绕“call、apply、bind 三者的区别与各自的使用场景是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕call/apply 立即调用,args 分布/数组;bind 返回新函数,预设 this 和参数。
围绕“Object.getPrototypeOf() 与 Object.setPrototypeOf() 在现代 Java”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖用于读取或修改对象的 [[Prototype]],虽然属性 __proto__ 也可,但标准方法更安全,且 class 中可用。
围绕“在 class 中使用 getter/setter 与普通方法有何区别?它们和属性描述符中的 get/set 是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕class 的 getter/setter 会被定义在原型上,并创建访问器属性描述符,效果等同 defineProperty。
本文讲清 in 运算符与 hasOwnProperty 的本质差别:前者沿原型链可检测到继承属性,后者只关心对象直接定义的键位。同时引入 Object.hasOwn 处理空原型和覆写场景,并给出实际判断步骤。
围绕“两个对象用 Object.is() 比较与 === 有何不同?如何处理 NaN 和 +0/-0”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕Object.is 将 NaN 视为相等,且区分 +0 和 -0,而 === 将两者视为相等。
围绕“Symbol.hasInstance 如何自定义 instanceof 的行为”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕通过在类上定义静态 Symbol.hasInstance 方法来改变 instanceof 结果。
围绕“Object.prototype.isPrototypeOf() 与 instanceof 有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕isPrototypeOf 检查原型链中是否包含特定对象,instanceof 检查构造函数原型链。
围绕“Object.keys(), Object.getOwnPropertyNames(), Object.getOwn”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕keys 只返回可枚举字符串属性,getOwnPropertyNames 返回所有字符串属性(含不可枚举),symbols 。
围绕“如何不通过继承在多个 class 间共享方法?JavaScript 的 mixin 设计思路是什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕通过 Object.assign 或函数组合将方法混合到原型,避免单一继承的局限。
围绕“使用 Object.create(null) 创建的对象有什么特殊性?哪些方法不可用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕没有原型,因此没有 hasOwnProperty、toString 等,且不能用于 instanceof 判断。
围绕“configurable:false 的属性有哪些操作被禁止”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕禁止删除、修改描述符(除 writable 改为 false)、不能切换访问器与数据属性。
围绕“可选链 ?. 能安全访问深层属性,它与传统 && 短路有什么不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖可选链可以对 null/undefined 返回 undefined,同时短路整个链条;&& 适用于一般真值判断。
围绕“JavaScript 对象中数字键在枚举时的顺序是怎样的?为何会有这种顺序”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖整数索引按升序排列,但只适用于数组索引键,其他按插入顺序;for...in 也遵循。
通过一个同时含普通赋值属性和 defineProperty 属性的对象,展示 enumerable:false 对 for...in 与 Object.keys() 的共同过滤效果,并指出 for...in 还会包含原型链上的可枚举属性,而 Object.keys() 不会。
围绕“用 Object.defineProperty 定义 getter/setter 与字面量访问器有何区别”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖主要区别是两种写法的语法不同,但行为一致,且都可定义可枚举/可配置等属性。
本题说明 writable:false 属性在严格模式赋值抛 TypeError、非严格模式静默失败且值不变,并讲解描述符机制、配置对象场景、易失效边界与可操作的检查方式。
本文阐明 JavaScript 原型链上属性查找的精确次序,涵盖自身属性优先、逐级上溯至 null、遮蔽效应、this 绑定和运行时原型修改影响,并通过实际代码和工程场景帮助理解。
围绕“Proxy 的 get 陷阱如何应用在属性读取上,尤其是在链式调用中”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕get 陷阱可以在读取属性时返回自定义函数或值,用于链式调用、自动绑定等。
围绕“如果目标对象具有不可配置且不可写的数据属性,Proxy 的 set 陷阱必须返回什么”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕满足不变量:如果目标属性不可写且不可配置,则不能修改其值,set 必须返回 false。
围绕“JavaScript 的 Object.freeze() 与深度冻结有何区别?如何实现深度冻结”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕freeze 只冻结对象自身,深度冻结需递归检查并冻结嵌套对象,注意循环引用。
围绕“Reflect.ownKeys() 返回的键顺序是怎样的?与 Object.keys() 有何不同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕返回所有自身键(含不可枚举和 symbol),顺序为整数索引升序、字符串顺序、最后 symbols;与 keys 不同在于 。
围绕“Reflect.set 与普通赋值在行为上有什么异同”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕Reflect.set 返回布尔值,且可通过 receiver 指定 this;赋值不抛出(严格模式可能)。
围绕“如何创建一个可撤销的 Proxy?撤销后操作会怎样”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕通过 Proxy.revocable 创建,调用 revoke 函数后任何捕获操作都抛出 TypeError。
围绕“Object.seal() 与 Object.freeze() 分别允许哪些修改操作”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕seal 禁止增删属性但允许修改现有属性值;freeze 使属性不可写且属性不可配置。
围绕“什么是深拷贝?如何实现深度克隆一个对象,包括处理循环引用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕深拷贝创建独立结构,循环引用可通过 WeakMap 记录,或使用 structuredClone。
围绕“对象扩展运算符 { ...obj } 会复制哪些属性?非可枚举属性会被复制吗”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕只复制自身的可枚举属性,不复制原型链,也不复制不可枚举。
围绕“ES6 class 的静态方法会被子类继承吗?如何调用”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕静态方法通过 [[Prototype]] 链继承,子类可以访问,也可在子类中覆盖。
围绕“如何通过 Symbol.toStringTag 来自定义 Object.prototype.toString 的行为”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖从 ES6 起,toString 会查找对象的 Symbol.toStringTag 属性来返回自定义标签。
围绕“如何用 WeakMap 模拟 class 的私有状态?相比 # 私有字段有什么优劣”给出直接结论、机制拆解、可复现验证、常见误区与追问,重点覆盖回答需要围绕WeakMap 键为实例,外部不可见,但需要闭包和模块作用域,不能防止遍历;对比 # 的严格语法。