MST
星途 面试题库

面试题:JavaScript对象原型链与可扩展能力的深度关联

假设存在构造函数`function Animal() {}`和`function Dog() {}`,`Dog`继承自`Animal`。现在需要对`Dog`实例对象的可扩展能力进行特殊设计,使得通过`Dog`创建的实例,其自有属性不能被删除,但原型链上的属性可以正常操作,同时不影响`Animal`构造函数创建实例的正常可扩展性,请问该如何实现,并解释原理。
45.8万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 实现代码如下
    function Animal() {}
    
    function Dog() {
        Object.preventExtensions(this);
    }
    Dog.prototype = Object.create(Animal.prototype);
    Dog.prototype.constructor = Dog;
    
  2. 原理解释
    • 自有属性不可删除:在Dog构造函数内部,使用Object.preventExtensions(this)方法。Object.preventExtensions会阻止新属性添加到对象中,并且使得对象现有的自有属性不能通过delete操作符删除,从而满足了Dog实例自有属性不能被删除的要求。
    • 原型链属性正常操作:通过Dog.prototype = Object.create(Animal.prototype)Dog的原型设置为Animal原型的一个新实例。这样Dog实例的原型链属性可以正常访问和操作,因为Object.preventExtensions只作用于实例本身的自有属性,不会影响原型链上的属性。
    • 不影响Animal构造函数创建实例的正常可扩展性:因为Animal构造函数本身没有受到任何特殊处理,其创建的实例对象保持正常的可扩展性,Animal实例可以正常添加和删除自有属性。