JS Pro-深入面向对象的程序设计之继承的详解

yizhihongxing

JS Pro-深入面向对象的程序设计之继承的详解

本攻略将从以下内容入手,逐步深入探讨JavaScript面向对象编程中的继承。

  1. 原型链继承
  2. 构造函数继承
  3. 组合继承
  4. 原型式继承
  5. 寄生式继承
  6. 寄生组合式继承

原型链继承

原型链继承,顾名思义,指的是连接原型链的方式进行继承。简单来说,就是在子类的构造函数中通过关联父类的原型实现继承。

function Parent() {
  this.parentName = 'Tom';
}

Parent.prototype.sayHello = function() {
  console.log("Hello, " + this.parentName);
}

function Child() {
  this.childName = 'Jerry';
}

Child.prototype = new Parent();

Child.prototype.sayHi = function() {
  console.log("Hi, " + this.childName);
}

var child = new Child();
child.sayHello();    //输出 "Hello, Tom"
child.sayHi();       //输出 "Hi, Jerry"

构造函数继承

构造函数继承,就是通过在子类的构造函数中调用父类的构造函数实现继承。这里使用apply方法绑定this,实现让子类接受父类的私有属性。

function Parent(name) {
  this.parentName = name;
  this.sayHello = function() {
    console.log("Hello, " + this.parentName);
  }
}

function Child(name) {
  Parent.apply(this, [name]);
  this.childName = 'Jerry';
  this.sayHi = function() {
    console.log("Hi, " + this.childName);
  }
}

var child = new Child('Tom');
child.sayHello();     //输出 "Hello, Tom"
child.sayHi();        //输出 "Hi, Jerry"

组合继承

组合继承,把原型链继承和构造函数继承结合起来使用,这是一种最常用的继承方式。它通过在子类的构造函数中调用父类的构造函数,实现了继承父类的私有属性;通过将父类的原型赋值给子类的原型,实现了继承父类的共有属性和方法。

function Parent(name) {
  this.parentName = name;
}

Parent.prototype.sayHello = function() {
  console.log("Hello, " + this.parentName);
}

function Child(name) {
  Parent.call(this, name);
  this.childName = 'Jerry';
}

Child.prototype = new Parent();
Child.prototype.constructor = Child;

Child.prototype.sayHi = function() {
  console.log("Hi, " + this.childName);
}

var child = new Child('Tom');
child.sayHello();     //输出 "Hello, Tom"
child.sayHi();        //输出 "Hi, Jerry"

原型式继承

原型式继承,是通过利用已有对象创建新对象,作为形参传入,即可创建一个新对象的方式实现继承。虽然它看上去很灵活、简单,但它的继承关系是实现在对象之间的,不能描述基于类的继承,因此这种方式并不是很常用。

var obj = {
  name: 'Tom',
  sayHello: function() {
    console.log('Hello, ' + this.name);
  }
};

var newObj = Object.create(obj);

newObj.name = 'Jerry';
newObj.sayHello();      //输出 "Hello, Jerry"

寄生式继承

寄生式继承是在原型式继承的基础上,在新创建的对象上增强属性和方法,然后再返回这个新的对象。这种技巧常常用来封装继承的过程,以便于复用。

function createObj(obj) {
  var clone = Object.create(obj);
  clone.sayHi = function() {
    console.log('Hi, ' + this.name);
  };
  return clone;
}

var obj = {
  name: 'Tom',
  sayHello: function() {
    console.log('Hello, ' + this.name);
  }
};

var newObj = createObj(obj);
newObj.name = 'Jerry';
newObj.sayHello();     //输出 "Hello, Jerry"
newObj.sayHi();        //输出 "Hi, Jerry"

寄生组合式继承

寄生式组合继承,是组合继承的一种优化写法,它采用了在父类实例的基础上,再用子类的原型覆盖一部分父类的原型(继承父类的共有属性和方法),这样既保留了传统继承的优点,避免了多次调用父类构造函数造成的性能浪费,也修复了组合继承覆盖原型的缺点。这种实现方式是目前继承方案中最为常用的方式。

function Parent(name) {
  this.parentName = name;
}

Parent.prototype.sayHello = function() {
  console.log("Hello, " + this.parentName);
}

function Child(name) {
  Parent.call(this, name);
  this.childName = 'Jerry';
}

Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;

Child.prototype.sayHi = function() {
  console.log("Hi, " + this.childName);
}

var child = new Child('Tom');
child.sayHello();     //输出 "Hello, Tom"
child.sayHi();        //输出 "Hi, Jerry"

以上就是JavaScript面向对象编程中继承的详细介绍,包括6种常见实现方式。在实际开发中,应根据具体需求选择适合的继承方式来完成开发任务。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS Pro-深入面向对象的程序设计之继承的详解 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • js 显示日期时间的实例(时间过一秒加1)

    当我们需要在页面中显示当前的日期时间时,可以使用 JavaScript 编写代码来实现。我们可以使用Date()对象来获取当前的日期时间,并使用setInterval()函数来每秒更新时间。下面是一个基本的实例,可以每秒钟更新显示的时间: 代码实现 <p id="time"></p> <script> …

    JavaScript 2023年5月27日
    00
  • 高性能的javascript之加载顺序与执行原理篇

    加载顺序 JavaScript 的加载顺序在浏览器中是从上到下、从左到右的,也就是按照 HTML 文档中<script>标签的出现的顺序进行逐个加载和执行。此外,当遇到<script>标签中的defer或async属性时,也会影响 JavaScript 脚本的加载与执行顺序。 defer:表示该脚本在 HTML 文档中的其他元素加载完…

    JavaScript 2023年5月27日
    00
  • JavaScript实现使用Canvas绘制图形的基本教程

    JavaScript实现使用Canvas绘制图形是前端开发中的重要技能之一。下面是使用Canvas绘制图形的基本教程。 1. 了解Canvas Canvas是HTML5中提供的一个可以在网页中使用JavaScript绘制图形的元素,它可以用来绘制各种图形,如直线、矩形、圆形、多边形以及文本等。 2. HTML中创建Canvas元素 在HTML中,可以使用&l…

    JavaScript 2023年5月28日
    00
  • 微信小程序实现表单验证源码

    准备工作首先需要准备微信小程序开发环境,下载并安装微信web开发者工具。在微信开发者工具中新建一个小程序项目。 创建表单页面在微信开发者工具中,创建一个新的页面作为表单页面。可以使用 WXML 语言编写页面结构,使用 WXSS 语言编写页面样式。 表单验证使用 JavaScript 代码对表单进行验证。可以在表单提交时将数据传递给验证函数。 示例代码: //…

    JavaScript 2023年6月10日
    00
  • 使用javascript实现有效时间的控制,并显示将要过期的时间

    使用JavaScript实现有效时间的控制可以采用以下步骤: 1.创建一个Date对象来获取当前时间。如下所示: const now = new Date(); 2.通过加上有效时间的毫秒数(比如一小时的有效时间为3600000毫秒)来计算出存储到cookie或localstorage中的过期时间。如下所示: const expirationTime = n…

    JavaScript 2023年5月27日
    00
  • 用javascript父窗口控制只弹出一个子窗口

    要实现父窗口控制只弹出一个子窗口,需要满足以下几个步骤: 在父窗口中定义一个全局变量,用于保存打开的子窗口对象。 在打开子窗口的函数中,先判断全局变量是否为空。如果为空,说明没有打开过子窗口,那么创建新的子窗口对象并赋值给全局变量。如果不为空,说明已经存在子窗口,那么判断子窗口是否关闭,如果关闭,则再次创建新的子窗口对象并赋值给全局变量;如果没有关闭,则聚焦…

    JavaScript 2023年6月11日
    00
  • egg.js的基本使用实例

    下面我为大家讲解一下 Egg.js 的基本使用实例: 简介 Egg.js 是一个基于 Node.js 和 Koa.js 的企业级应用开发框架,它提供了一套易于上手的约定和最佳实践,并基于这些约定和最佳实践提供了适用于企业级应用的各种插件和扩展,同时还支持基于插件的扩展机制,让用户可以根据自己的需要对框架进行个性化定制。 安装 安装 Egg.js 的前提条件是…

    JavaScript 2023年6月11日
    00
  • js时间日期和毫秒的相互转换

    没问题,下面就给您详细讲解”JS时间日期和毫秒的相互转换”的完整攻略。 1. 介绍 在JS中,时间和日期是常用的数据类型。通常情况下,我们需要将时间和日期转成毫秒数以进行计算或者存储,也需要将毫秒数转换为可读的时间和日期表现。 2. 时间与毫秒的转换 2.1 时间转换为毫秒数 在JS中,我们可以利用Date对象的getTime()方法来将时间转换为毫秒数。g…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部