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日

相关文章

  • CSS3动画和HTML5新特性详解

    CSS3动画和HTML5新特性详解 什么是CSS3动画和HTML5新特性? CSS3动画指的是使用CSS3语法实现的动画效果,可以通过CSS3中提供的关键帧动画、过渡、变换等功能制作出各种复杂的动画效果。 HTML5则是新一代的网页编程标准,可以实现各种新特性,如语义化标签、Canvas绘图、音视频播放等,可以提高网页的交互性,性能和可访问性。 如何使用CS…

    JavaScript 2023年6月10日
    00
  • 了解JavaScript中的选择器

    了解JavaScript中的选择器 在JavaScript中,选择器是非常重要的概念之一,它其实就是一种语法,可以帮助我们从HTML文档中选择出需要操作的元素。以下是本攻略的主要内容。 基础选择器 通过id选择元素 我们可以通过简单的 getElementById() 方法选择文档中的元素,只需使用元素的id标识作为参数即可。 示例代码: let myEle…

    JavaScript 2023年5月18日
    00
  • javascript数组去重的方法汇总

    针对“javascript数组去重的方法汇总”的话题,我将为您提供完整的攻略,并给出两条示例说明。 一、问题背景 在javascript开发中,很常见的问题是如何从一个数组中找出不重复的数据。数组去重在实际开发中非常有用,例如:从数据库中查询数据后想要去除相同项展示给用户,或者需要合并两个数组并去除重复项。本文将为大家总结一下常用的去重方法。 二、方法汇总 …

    JavaScript 2023年5月27日
    00
  • 微信小程序 倒计时组件实现代码

    下面就来分享微信小程序中倒计时组件的实现过程吧。 准备工作 在开始具体讲解之前,需要对微信小程序的基础知识有一定的了解,包括:- 小程序的目录结构- WXML、WXSS、JS、JSON 文件的作用- 小程序的基础组件和事件绑定等操作 倒计时组件实现步骤 1. 创建小程序项目 首先,在微信开发者工具中创建一个基础的小程序项目。 2. 创建倒计时组件 在项目中创…

    JavaScript 2023年6月11日
    00
  • ES2015 正则表达式新增特性

    ES2015 正则表达式新增特性是指 ECMAScript 2015 标准中新增了一些正则表达式相关的语法和特性。在这里我将为您详细讲解这些新增特性,以及它们的使用示例,以便您更好地掌握正则表达式的应用。 1. 新增的 y 修饰符 ES2015 引入了 y 修饰符,旨在实现粘性匹配。它与 g 修饰符的作用类似,但是 y 修饰符只能在匹配的字符串开头执行匹配,…

    JavaScript 2023年6月10日
    00
  • Javascript闭包演示代码小结

    Javascript闭包演示代码小结 Javascript中的闭包是一个非常重要的概念,许多初学者对此有些困惑,下面是我对闭包的探究过程及代码演示,希望对大家有所帮助。 什么是闭包 闭包是指有权访问另一个函数作用域中的变量的函数。 在Javascript中,函数是第一类对象,可以像普通变量一样传递,所以函数中定义的变量在函数外部也可以访问,但是如果在外部将函…

    JavaScript 2023年6月10日
    00
  • js中arguments对象的深入理解

    深入理解JavaScript中的Arguments对象 在JavaScript中,每个函数在被调用的时候都会自动获取一个名为“arguments”的对象。这个对象中包含了该函数被传入的所有参数,并且可以在函数内部进行访问和操作。 Arguments对象简介 Arguments对象是什么? Arguments对象是一个类数组对象,它包含了当前函数被调用时所传入…

    JavaScript 2023年5月27日
    00
  • Javascript之BOM(window对象)详解

    Javascript之BOM(window对象)详解 什么是BOM 在Web页面中,JavaScript可以调用浏览器提供的API,这些API就组成了BOM。BOM(浏览器对象模型)提供了一组对象,并且每个对象都有相关的属性和方法,可以操作浏览器窗口。BOM除了提供了访问浏览器接口的对象外,还提供了访问用户代理信息的导航对象。其中,window对象是BOM最…

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