MST

星途 面试题库

面试题:JavaScript属性特性在原型链中的表现及应用

假设有一个构造函数Parent,其原型对象上定义了一个属性parentProp,属性特性设置为不可写。然后有一个构造函数Child继承自Parent ,在Child的实例上尝试修改parentProp属性,会发生什么?请详细分析整个过程中属性特性在原型链上是如何起作用的,并用代码实现及解释。
49.6万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 分析
    • 当在Child实例上尝试修改parentProp属性时,由于parentPropParent.prototype上设置为不可写,所以直接修改不会生效。JavaScript会沿着原型链查找属性,因为Child继承自Parent,所以会找到Parent.prototype上的parentProp。但由于其不可写特性,修改操作被忽略。
  2. 代码实现
// 定义Parent构造函数
function Parent() {}
// 在Parent的原型对象上定义parentProp属性,并设置为不可写
Object.defineProperty(Parent.prototype, 'parentProp', {
    value: 'parent value',
    writable: false
});
// 定义Child构造函数,继承自Parent
function Child() {
    Parent.call(this);
}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
// 创建Child实例
const child = new Child();
// 尝试修改parentProp属性
child.parentProp = 'new value';
// 输出parentProp属性
console.log(child.parentProp);
  1. 解释
    • 首先定义了Parent构造函数,并使用Object.defineProperty在其原型对象上定义了parentProp属性,设置writablefalse,表示不可写。
    • 然后定义Child构造函数,通过Object.create实现继承。
    • 创建Child实例child,尝试修改parentProp属性为'new value'
    • 最后输出child.parentProp,会发现输出的仍然是'parent value',说明由于parentProp在原型上不可写,修改操作未成功。