MST
星途 面试题库

面试题:JavaScript 对象属性特性与原型链的交互影响

假设存在一个构造函数 `Parent`,其原型对象上有一个属性 `protoProp`,属性特性设置为 `{writable: false, configurable: false, enumerable: true}`。然后有一个构造函数 `Child` 继承自 `Parent`。当在 `Child` 的实例上尝试修改、删除 `protoProp` 以及通过 `for...in` 遍历实例时,会发生什么情况?请详细分析并给出代码示例。
20.4万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 分析修改 protoProp 的情况
    • 由于 protoPropwritable 特性为 false,在 Child 实例上尝试修改 protoProp 不会生效,它会保持原型对象上 protoProp 的初始值。
  2. 分析删除 protoProp 的情况
    • 因为 protoPropconfigurable 特性为 false,在 Child 实例上尝试删除 protoProp 也不会生效,protoProp 仍然存在于原型链上。
  3. 分析通过 for...in 遍历实例的情况
    • 由于 protoPropenumerable 特性为 true,通过 for...in 遍历 Child 实例时,protoProp 会被枚举出来。

代码示例

function Parent() {}
Parent.prototype.protoProp = 'parent value';
// 设置属性特性
Object.defineProperty(Parent.prototype, 'protoProp', {
    writable: false,
    configurable: false,
    enumerable: true
});

function Child() {}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;

let child = new Child();

// 尝试修改 protoProp
child.protoProp = 'new value';
console.log(child.protoProp); // 输出: parent value

// 尝试删除 protoProp
delete child.protoProp;
console.log('protoProp' in child); // 输出: true

// 通过 for...in 遍历
for (let key in child) {
    console.log(key); // 输出: protoProp
}