美文网首页
JavaScript 继承

JavaScript 继承

作者: sunflower_07 | 来源:发表于2025-07-01 12:13 被阅读0次

JavaScript 继承

JavaScript 继承是经常被深入考察的话题,以下是一些常见的问题:

基础概念问题

  1. JavaScript 中有哪些实现继承的方式?
  • 原型链继承

  • 构造函数继承(借用构造函数)

  • 组合继承(原型链+构造函数)

  • 原型式继承

  • 寄生式继承

  • 寄生组合式继承

  • ES6 Class 继承

  1. 原型链继承的优缺点是什么?
  • 优点:简单,能继承父类原型上的属性和方法

  • 缺点:所有实例共享原型属性;无法向父类构造函数传参

  1. 构造函数继承的优缺点是什么?
  • 优点:可以在子类中向父类传递参数;避免了引用属性共享问题

  • 缺点:不能继承父类原型上的方法;方法都在构造函数中定义,无法复用

深入技术问题

  1. 组合继承有什么问题?如何优化?
  • 问题:会调用两次父类构造函数

  • 优化:使用寄生组合式继承

  1. 寄生组合式继承为什么是最佳实践?
  • 只调用一次父类构造函数

  • 避免在子类原型上创建不必要的属性

  • 保持原型链不变

  1. ES6 Class 继承和 ES5 继承有什么区别?
  • Class 继承使用 extendssuper

  • Class 继承实质上是语法糖,底层还是基于原型链

  • Class 继承有更严格的语法检查

代码实现问题

  1. 手写一个寄生组合式继承的实现

function inheritPrototype(subType, superType) {

  const prototype = Object.create(superType.prototype);

  prototype.constructor = subType;

  subType.prototype = prototype;

}

function SuperType(name) {

  this.name = name;

}

function SubType(name, age) {

  SuperType.call(this, name);

  this.age = age;

}

inheritPrototype(SubType, SuperType);

  1. 解释下面代码的输出结果

function Parent() {

  this.name = 'parent';

}

Parent.prototype.sayName = function() {

  console.log(this.name);

};

function Child() {

  this.name = 'child';

}

Child.prototype = new Parent();

const child = new Child();

child.sayName(); // 输出什么?为什么?

实际应用问题

  1. 如何实现多重继承?
  • JavaScript 本身不支持多重继承,但可以通过混入(Mixin)模式模拟
  1. 在大型项目中,你会选择哪种继承方式?为什么?

    • 通常会选择 ES6 Class 继承,因为语法清晰,易于维护

    • 如果需要更精细控制,可能会选择组合继承或寄生组合式继承

  2. 如何判断一个对象是否是另一个对象的原型?

    • 使用 Object.prototype.isPrototypeOf()

    • instanceof 操作符

准备这些问题时,最好能够结合实际代码示例来解释,展示你对 JavaScript 继承机制的深入理解。

function Parent() {

this.name = 'parent';

}

Parent.prototype.sayName = function() {

console.log(this.name);

};

function Child() {

this.name = 'child';

}

Child.prototype = new Parent();

const child = new Child();

child.sayName(); // 输出什么?为什么?

这段代码的输出结果是:

"child"

代码解析:

  1. Parent 构造函数
  • 定义了一个实例属性 this.name = 'parent'

  • Parent.prototype 上添加了一个方法 sayName(),用于打印 this.name

  1. Child 构造函数
  • 定义了一个实例属性 this.name = 'child'

  • Child.prototype 设置为 new Parent(),即 Child 继承 Parent 的原型链

  1. const child = new Child()
  • 执行 Child 构造函数,this.name 被赋值为 'child'

  • child 的原型 (__proto__) 指向 Parent 的实例(new Parent()

  1. child.sayName()
  • child 本身没有 sayName 方法,所以沿着原型链查找

  • Parent.prototype 上找到 sayName 并调用

  • sayName() 中的 this 指向 child 实例,所以 this.name'child'(而不是 Parent'parent'

关键点:

  • this 的指向sayName()child 调用,所以 this 指向 child 实例,而不是 Parent 实例。

  • 原型链查找child 本身没有 sayName,所以会去 Child.prototype(即 new Parent())上找,再往上到 Parent.prototype 找到 sayName

如果修改代码:


Child.prototype = Parent.prototype; // 直接继承 Parent.prototype,而不是 new Parent()

const child = new Child();

child.sayName(); // 仍然输出 "child"

  • 这样 Child.prototype 直接指向 Parent.prototype,不再执行 new Parent(),但 this 仍然指向 child,所以 this.name 还是 'child'

总结:

  • 原型链继承 的关键是 Child.prototype = new Parent(),使得 Child 的实例可以访问 Parent 原型上的方法。

  • this 指向调用者,所以 child.sayName() 打印的是 childname,而不是 Parentname

相关文章

  • 前端面试题目(二)

    javascript对象的几种创建方式 javascript继承的6种方法 详情:[JavaScript继承方式详...

  • 函数的原型对象

    什么是原型? 原型是Javascript中的继承的继承,JavaScript的继承就是基于原型的继承。 函数的原型...

  • 005|JavaScript ES6新特性之Classes

    在过去,需要像 053|JavaScript 继承详解 那样实现继承。JavaScript这种继承实现方式与其它面...

  • Web前端经典面试试题及答案2

    javascript面向对象中继承实现? 面向对象的基本特征有:封闭、继承、多态。在JavaScript中实现继承...

  • 一文带你彻底理解 JavaScript 原型对象

    一、什么是原型 原型是Javascript中的继承的基础,JavaScript的继承就是基于原型的继承。 1.1 ...

  • javascript代码积累

    一、javascript实现继承 1.基于原型链实现继承 2.基于属性和方法复制实现继承 二、javascript...

  • 理解 JavaScript 中的原型链

    JavaScript 作为一门面对对象语言,但是却不支持接口继承,只支持实现继承。JavaScript 中实现继承...

  • Javascript原型和原型链

    JavaScript在ES6之前没有类似class,extend的继承机制,JavaScript的继承主要是通过原...

  • JavaScript--对象创建和继承方法

    JavaScript创建对象方法总结精彩博文javascript继承讲解精彩博文于江水 继承讲解 JavaScri...

  • JavaScript 继承

    继承是JS中非常内容,原因就是JS没有地道的继承方式,我们只能通过各种方式来模拟面向对象中的继承。下面介绍几种常见...

网友评论

      本文标题:JavaScript 继承

      本文链接:https://www.haomeiwen.com/subject/bdhigjtx.html