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

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日

相关文章

  • JavaScript的事件机制详解

    JavaScript的事件机制详解 事件机制是 JavaScript 重要的一部分,它使得 Web 应用得以用户交互和响应。在本文中,我将详细讲解 JavaScript 的事件机制,包括事件模型、事件流以及事件捕获和冒泡。 事件模型 JavaScript 事件模型是一种基于事件触发的编程模型。当用户操作网页中的元素(如按钮、文本输入框等)时,会触发事件,Ja…

    JavaScript 2023年5月28日
    00
  • JavaScript实现读取与输出XML文件数据的方法示例

    JavaScript可以通过浏览器的XMLHttprequest对象来读取和处理XML文件,然后将数据进行输出和展示。下面是实现读取和输出XML文件数据的方法示例,共分为以下几个步骤: 1.创建XMLHttprequest对象 要读取XML文件数据,首先需要创建XMLHttprequest对象,并将其作为变量存储在JavaScript中。 var xmlht…

    JavaScript 2023年5月27日
    00
  • 项目中使用TypeScript的TodoList实例详解

    针对“项目中使用TypeScript的TodoList实例详解”的完整攻略,我提供以下内容: 1. 什么是TypeScript? TypeScript 是一种由微软开发的开源编程语言。它是 JavaScript 的一个超集,包含了所有 JavaScript 代码的语法,但并不完全使用 JavaScript 来实现,相比 JavaScript 更加严格和类型化…

    JavaScript 2023年6月11日
    00
  • JavaScript 获取当前时间戳的代码

    获取当前时间戳是指获取当前时间与某一特定时间(一般为1970年1月1日00:00:00 UTC)之间的毫秒数。JavaScript提供了多种方法来获取当前时间戳。 Date对象的getTime()方法 在JavaScript中,Date对象提供了getTime()方法来获取当前时间戳。该方法返回自1970年1月1日00:00:00 UTC以来的毫秒数。以下是…

    JavaScript 2023年5月27日
    00
  • [asp]阿里西西的alexa采集效果代码

    [asp]阿里西西的alexa采集效果代码 简介 本篇攻略主要介绍如何使用阿里西西的alexa采集效果代码来获取Alexa排名数据。使用该代码可以方便地获取网站的国内和全球排名数据,且不需要使用Alexa API或第三方库。 准备工作 在使用该代码前,需要完善以下几个步骤: 首先需要申请上线的API Key,可以在阿里西西官网上进行申请:https://ww…

    JavaScript 2023年6月10日
    00
  • JavaScript闭包和作用域链的定义实现

    JavaScript闭包和作用域链的定义实现 什么是闭包? 在JavaScript中,闭包是指每个函数在创建时会生成一个自己的执行环境,这个执行环境可以访问到它自身定义的变量、参数,也可以访问父级的变量,而且这个执行环境可以一直存在,即使函数执行完,此时这个执行环境也不会被销毁。 简单来说,就是可以访问父级作用域的函数,创建出来的执行环境,这种执行环境中包含…

    JavaScript 2023年6月10日
    00
  • 关于JavaScript与HTML的交互事件

    关于JavaScript与HTML的交互事件的完整攻略,我们可以通过以下步骤进行实现: 1.选中HTML元素 我们可以使用JavaScript选择器去选中我们想要操作的HTML元素,可以是ID、class、标签名等。 示例一: <!DOCTYPE html> <html> <head> <title>选中HTM…

    JavaScript 2023年6月10日
    00
  • javascript showModalDialog传值与FireFox的window.open 父子窗口传值示例

    针对这个话题,我将给出完整的攻略,包含如下内容: showModalDialog传值的示例说明 window.open父子窗口传值的示例说明 相关代码和详细解析 1. showModalDialog传值的示例说明 showModalDialog是JavaScript中的一个对话框方法,使用它我们可以打开模态对话框,将父窗口传入的值传递给子窗口。下面给出具体的…

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