MST

星途 面试题库

面试题:JavaScript动态修改属性特性对原型链的影响

有一个构造函数`function Animal() {}`,`Animal.prototype.species = 'mammal'`。创建一个实例`let dog = new Animal()`,然后使用`Object.defineProperty`动态修改`dog`实例的`species`属性的`configurable`特性为`false`,接着再尝试在原型链上修改`species`属性,会发生什么?请解释原因并给出代码示例。
26.1万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 解释
    • 当使用Object.definePropertydog实例的species属性的configurable特性设为false后,该属性不能再通过delete操作符删除,也不能再次修改其特性(除writabletrue时可修改属性值)。
    • 当在原型链上修改species属性时,由于dog实例已经有了自己的species属性(尽管它最初是从原型链继承而来),所以不会影响到dog实例的species值。dog实例的species值仍然保持不变,因为JavaScript查找属性时,首先在实例自身查找,如果找到了就不会再去原型链上查找。
  2. 代码示例
function Animal() {}
Animal.prototype.species ='mammal';
let dog = new Animal();
Object.defineProperty(dog,'species', {
    configurable: false
});
// 在原型链上修改species属性
Animal.prototype.species = 'new mammal';
console.log(dog.species); // 输出'mammal',不会受到原型链修改的影响