JS继承与工厂构造及原型设计模式详解

yizhihongxing

JS继承与工厂构造及原型设计模式详解

什么是继承?

继承是指一个对象直接使用另一个对象的属性和方法。在JavaScript中,对象可以通过继承原型链上的属性和方法。

继承的方式

JavaScript中实现继承的方式有以下几种:

1. 原型链继承

原型链继承是指将父类的实例作为子类的原型。实现方式如下:

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

Parent.prototype.getName = function() {
  return this.name;
}

function Child() {}

Child.prototype = new Parent();

var child = new Child();
console.log(child.getName()); // Parent name

原型链继承存在的问题是:当我们给子类的原型中添加一个引用类型的属性时,这个属性会被所有子类实例共享,且可能导致数据的误修改。

2. 借用构造函数继承

借用构造函数继承是指在子类构造函数中通过apply或call方法调用父类的构造函数。实现方式如下:

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

function Child(name) {
  Parent.call(this, name);
}

var child = new Child('Child name');
console.log(child.name); // Child name

借用构造函数继承的优势是可以传参,并且通过子类实例修改引用类型的属性不会影响其它实例。

借用构造函数继承的缺点是不能继承父类原型链上的属性和方法。

3. 组合继承

组合继承是指将原型链继承和借用构造函数继承结合起来使用。实现方式如下:

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

Parent.prototype.getName = function() {
  return this.name;
}

function Child(name, age) {
  Parent.call(this, name);
  this.age = age;
}

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

Child.prototype.getAge = function() {
  return this.age;
}

var child = new Child('Child name', 10);
console.log(child.getName());
console.log(child.getAge());

组合继承是继承中最常用的方式,它既可以继承父类构造函数中的属性,也可以继承原型链上的属性和方法,缺点是调用了两次父类构造函数。

4. 原型式继承

借助原型可以基于已有的对象创建新的对象,可以达到类似于继承的效果。实现方式如下:

var parent = {
  name: 'Parent name',
  getName: function() {
    return this.name;
  }
}

var child = Object.create(parent);
child.name = 'Child name';
console.log(child.getName()); // Child name

在原型式继承中,引用类型的属性共享问题存在,也就是说,修改一个子类实例上的引用类型属性会影响其它实例。

5. 寄生式继承

寄生式继承的基本思路是创建一个新对象,然后将该对象作为参数传入一个封装的函数中,在函数内部增强该对象,最后返回这个对象。实现方式如下:

function createChild(parent) {
  var child = Object.create(parent);
  child.sayHello = function() {
    console.log('Hello');
  }
  return child;
}

var parent = {
  name: 'Parent name',
  getName: function() {
    return this.name;
  }
}

var child = createChild(parent);
child.name = 'Child name';
console.log(child.getName());
child.sayHello(); // Hello

寄生式继承与原型式继承一样,无法避免引用类型共享的问题。

6. 寄生组合式继承

寄生组合式继承是组合继承的优化版,通过构造函数继承避免了调用两次父类构造函数的问题。实现方式如下:

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

Parent.prototype.getName = function() {
  return this.name;
}

function Child(name, age) {
  Parent.call(this, name);
  this.age = age;
}

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

Child.prototype.getAge = function() {
  return this.age;
}

var child = new Child('Child name', 10);
console.log(child.getName());
console.log(child.getAge());

工厂构造模式

工厂构造模式是一种通过工厂方法创建对象的方式。实现方式如下:

function createObject(name) {
  var obj = new Object();
  obj.name = name;
  obj.sayHello = function() {
    console.log('Hello');
  }
  return obj;
}

var obj = createObject('Object name');
obj.sayHello();

工厂构造模式可以通过多次调用工厂方法来创建多个相同结构的对象。缺点是对象无法识别,即无法通过instanceof运算符来确定对象的类型。

原型设计模式

原型设计模式是一种通过将方法挂载至原型对象上的方式来创建对象的方式。实现方式如下:

function Person() {}

Person.prototype.name = 'Person name';

Person.prototype.sayHello = function() {
  console.log('Hello');
}

var person1 = new Person();
var person2 = new Person();

console.log(person1.name);
console.log(person2.name);

person1.sayHello();

原型设计模式可以通过将同样的方法集中在原型对象上,从而避免了多次赋值方法的操作。同时,原型对象上的方法是可以被子类继承使用的。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS继承与工厂构造及原型设计模式详解 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • android实现图片闪烁动画效果的两种实现方式(实用性高)

    当使用Android开发时,可以使用两种方式实现图片闪烁动画效果。下面将详细介绍这两种实现方式,并提供两个示例说明。 方式一:使用透明度动画 首先,在XML布局文件中添加一个ImageView来显示图片: <ImageView android:id=\"@+id/imageView\" android:layout_width=\&…

    other 2023年9月7日
    00
  • 通过sql语句将blob里的char取出来转成数字保存在其它字段

    要将 blob 字段中的 char 类型数据转换成数字类型并保存在其它字段中,我们可以使用以下步骤: 在数据库表中新建一个列,用于保存转换后的数字。 通过 SQL 语句查询表中 blob 字段的数据,并使用 CAST 函数将其转换成 char 类型。 将 char 类型数据转换成数字,并用 UPDATE 语句将其存入新建的列中。 以下是两条示例说明: 假设我…

    other 2023年6月25日
    00
  • wmplayer

    使用WMPlayer播放视频文件 WMPlayer是Windows Media Player的简称,是一款Windows操作系统自带的多媒体播放器。它可以高效地播放各种视频和音频文件,并支持多种音视频编解码格式。 安装和打开WMPlayer WMPlayer作为Windows系统的内置软件,可以在“开始菜单”或“搜索栏”中快速找到。在打开WMPlayer之前…

    其他 2023年3月29日
    00
  • vue2实现directive自定义指令的封装与全局注册流程

    步骤一:创建自定义指令 Vue 2中可以通过全局方法Vue.directive()创建自定义指令,该方法接收两个参数,第一个参数为指令名称,第二个参数为钩子函数对象,其中钩子函数对象定义了指令的行为。 示例1:实现一个指令用于实现元素背景色的渐变效果,指令名称为v-gradient,使用方式为v-gradient=”{from: ‘#fff’, to: ‘#…

    other 2023年6月25日
    00
  • elementui框架中文网

    ElementUI 框架中文网攻略 ElementUI 是一款基于 Vue.js 的 UI 组件库,它提供了丰富的 UI 组件和交互效果,可以帮助开发者快速构建 Web 应用。在本攻略中,我们将介绍 ElementUI 框架中文网的使用方法,并提供两个示例说明。 ElementUI 框架中文网 UI 框架中文网是UI 官方提供的中文文网站,其中包含了 Ele…

    other 2023年5月6日
    00
  • 手把手教你如何用fiddler抓取手机数据包(ios+android)

    手把手教你如何用Fiddler抓取手机数据包(iOS+Android) 如果你是一名开发者或者测试人员,在某些场景下,需要通过抓包来获取手机端和服务器之间的通信数据,以进行测试和分析。而目前市面上最为流行和实用的抓包工具,非Fiddler莫属。 本教程将以iOS和Android设备为例,演示使用Fiddler进行手机数据包抓取的具体方法。 一、安装Fiddl…

    其他 2023年3月29日
    00
  • ArcMap中地图输出(Options)选项显示不完整

    下面是“ArcMap中地图输出(Options)选项显示不完整的完整攻略”,包括问题原因、解决方法和两个示例说明。 问题原因 在ArcMap中,地图输出(Options)选项显示不完整的原因可能是因为显示器分辨率不够高,或者是Windows显示设置中的文本大小设置过大。 解决方法 以下是解决ArcMap中地图输出(Options)选项显示不完整的方法: 1.…

    other 2023年5月5日
    00
  • angular中的observable问题

    Angular中的Observable问题 在Angular中,Observable是一种常用的异步编程工具,用于处理数据流和事件流。然而,对于初学者来说,可能会遇到一些与Observable相关的问题。本文将详细讲解一些常见的Observable问题,并提供两个示例说明。 问题1:订阅多个Observable时如何处理 当我们需要同时订阅多个Observa…

    other 2023年10月18日
    00
合作推广
合作推广
分享本页
返回顶部