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日

相关文章

  • jQuery中json对象的复制方式介绍(数组及对象)

    当我们在编写jQuery程序时,常常需要对JSON对象进行复制的操作,这个过程有时会比较麻烦,因为JSON对象类别繁多,每种类型都需要采用不同的复制方式。 接下来,我将介绍在jQuery中对各种JSON对象进行复制的方式,包括数组和对象。 数组复制 在jQuery中,数组复制有两种方式:浅复制和深复制。 浅复制 浅复制就是将一个数组中的所有元素全部复制到另一…

    JavaScript 2023年5月27日
    00
  • Js数组排序函数sort()介绍

    Js数组排序函数sort()介绍 简介 JavaScript中的数组有一个sort()方法可以对数组进行排序。sort()方法可以按照指定的排序规则进行排序。 语法 array.sort([compareFunction]) 其中,compareFunction是可选参数,用于指定排序的规则。如果没有指定参数,那么sort()方法会将数组元素按照Unicod…

    JavaScript 2023年5月27日
    00
  • JS端基于download.js实现图片、视频时直接下载而不是打开预览

    要实现前端直接下载文件而不是打开预览,可以借助 download.js 库来实现。download.js 是一个轻量级的 JavaScript 库,可以让你在浏览器中下载文件。它允许你使用 JavaScript 下载文件,无需打开预览窗口或重定向到下载链接。 以下是实现该功能的详细攻略: 步骤 1:引入下载库和样式文件 首先,你需要在你的 HTML 文件中引…

    JavaScript 2023年5月27日
    00
  • js中Math之random,round,ceil,floor的用法总结

    js中Math之random,round,ceil,floor的用法总结 在JavaScript(简称JS)中,Math对象是一个内置对象,它涵盖了一系列数学函数和常数。 本篇攻略主要介绍Math对象中的 random(), round(), ceil() 和 floor() 这四个常用函数的用法。 1. random() random() 函数返回一个浮点…

    JavaScript 2023年5月27日
    00
  • 前端常用的js函数方法

    在讲解前端常用的JS函数方法之前,先介绍一下JS的基础知识。 JS基础知识 1. 数据类型 JS中包含6种数据类型: string(字符串):用于表示文本数据,可使用单引号、双引号或反引号(ES6新增)引用字符串。如:’hello’、”world”、hello world; number(数字):表示数值数据,包括整数、浮点数、负数、正数、NaN等等。如:1…

    JavaScript 2023年5月27日
    00
  • 浅谈JS封闭函数、闭包、内置对象

    浅谈JS封闭函数、闭包、内置对象 JS封闭函数 JS的封闭函数,又称为IIFE(Immediately-Invoked Function Expression),是指定义一个匿名函数并立即执行该函数的语法结构。 封闭函数的特点: 定义一个函数,并立即自动调用该函数; 可以在全局作用域或另一个函数内部作用域中定义,从而实现封装变量和方法; 封闭函数的返回值可以…

    JavaScript 2023年6月10日
    00
  • javascript中数组array及string的方法总结

    JavaScript中数组(Array)及字符串(String)方法总结 在JavaScript中,数组以及字符串是非常重要的数据结构,同时也拥有很多的内置方法可以简化我们的开发流程。接下来将带你了解这些方法。 字符串(String)方法 1. indexOf 返回某个指定的子字符串在字符串中第一次出现的位置。 const str = "Hello…

    JavaScript 2023年5月27日
    00
  • 详解JavaScript UTC时间转换方法

    详解JavaScript UTC时间转换方法 在JavaScript中,我们通常使用的日期对象保存的是本地时间。但是,在跨时区使用的情况下,UTC时间经常会被使用。要将本地时间转换为UTC时间,或者将UTC时间转换为本地时间,可以使用JavaScript提供的函数来完成。下面介绍JavaScript UTC时间转换的方法。 1. new Date(Date.…

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