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

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日

相关文章

  • h3c交换机mac地址绑定、三层交换机固定ip上网、三层交换机端口配置ip地址的方法

    H3C交换机MAC地址绑定 在H3C交换机上,可以通过MAC地址绑定来限制特定设备的网络访问。下面是进行MAC地址绑定的步骤: 登录到H3C交换机的管理界面。 进入交换机的全局配置模式,输入以下命令: configure terminal 进入接口配置模式,选择要进行MAC地址绑定的接口,例如接口GigabitEthernet1/0/1,输入以下命令: in…

    other 2023年7月31日
    00
  • mongodbjavaapi操作很全的整理

    MongoDB Java API 操作很全的整理 MongoDB是一个流行的文档数据库,其Java API可以让Java开发者轻松地与MongoDB进行交互。本文将介绍MongoDB Java API的各种操作,包括CRUD操作、索引操作、聚合操作等,帮助Java开发者更好的使用MongoDB。 环境准备 在使用MongoDB Java API之前,需要先准…

    其他 2023年3月29日
    00
  • 入侵搜索关键字

    入侵搜索关键字攻略 入侵搜索关键字是指通过搜索引擎和其他工具来获取目标系统的敏感信息,以便进行未授权访问或其他恶意活动。下面是一个详细的攻略,包括两个示例说明。 步骤一:信息收集 在进行入侵搜索关键字之前,首先需要进行信息收集。这包括收集目标系统的域名、IP地址、子域名、邮箱地址等相关信息。以下是一些常用的信息收集工具和技术: Whois查询:使用Whois…

    other 2023年8月6日
    00
  • OPPO R17Pro手机怎么升级和降级系统?

    OPPO R17Pro手机升级系统 OPPO R17Pro手机的系统升级需要在设置中进行,下面是操作步骤: 1.进入“设置”应用,向下滑动页面找到“软件更新”选项。 2.点击“软件更新”,系统将开始检查更新,如果有更新可以选择“立即更新”或设置定时更新时间。 3.在升级过程中,请确保手机电池电量充足并保持良好的网络连接。 4.当下载完成后,系统将自动重启并安…

    other 2023年6月27日
    00
  • OpenFOAM-圆柱绕流

    OpenFOAM-圆柱绕流 OpenFOAM是一款开源的CFD(Computational Fluid Dynamics)软件,可以用于对流动的数值模拟。 在本篇文章中,我们将介绍如何使用OpenFOAM对圆柱绕流进行数值模拟。圆柱绕流是CFD中一个经典的问题,常常用于检验CFD软件的精度和可靠性。 问题描述 圆柱绕流问题指的是在二维平面内,一个圆柱被洪流所…

    其他 2023年3月28日
    00
  • MySQL中的JSON字段List成员检查

    标题:MySQL中的JSON字段List成员检查 1. JSON字段List成员检查 在MySQL中,可以使用JSON字段来存储数据。在JSON字段中,可以包含List类型数据。如果需要检查一个List数据中是否包含某个成员,可以使用MySQL中提供的JSON函数进行查询。 2. 使用JSON_CONTAINS函数 使用JSON_CONTAINS函数可以判断…

    other 2023年6月25日
    00
  • JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例

    JS代码屏蔽F12、右键、粘贴、复制、剪切、选中等操作,是一种常见的前端安全措施,可以避免恶意用户通过浏览器的开发工具获取网页的源代码和敏感信息。在下面的回答中,我将提供一些实现JS的屏蔽操作的方法和示例代码,并进行一些解释说明。 1.屏蔽F12和右键操作 通过下面的JS代码可以屏蔽F12和右键操作: document.onkeydown = functio…

    other 2023年6月27日
    00
  • 小米10开发者选项在哪?小米10开启开发者选项的方法

    我来为您详细讲解一下“小米10开发者选项在哪?小米10开启开发者选项的方法”。 1. 小米10开发者选项在哪? 在小米10上,开发者选项默认是隐藏的,需要您手动将其打开。操作步骤如下: 1.打开小米10设置应用。 2.向下滚动并找到“关于手机”选项并点击进入。 3.找到“MIUI版本”并点击7次。 4.出现“您现在是开发者”的提示,这时候,您就可以前往设置菜…

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