JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)

yizhihongxing

下面将分别讲解工厂模式、构造函数模式、原型模式、混合模式、动态原型模式的基础概念和应用,并且提供两个示例演示它们的具体用法。

工厂模式

工厂模式用于创建同一类型对象的方式,这种方式隐藏了对象创建的复杂性,避免了使用new关键字的过多,同时也可以使代码更加灵活。它通过一个函数来封装了所有实例化对象行为,并且返回一个新对象。下面是一个最简单的创建对象的工厂模式的示例:

function createObject() {
  var obj = new Object();
  obj.someProperty = "someValue";
  return obj;
}

var obj1 = createObject();
var obj2 = createObject();
console.log(obj1.someProperty); // 输出 "someValue"
console.log(obj2.someProperty); // 输出 "someValue"

在上面的例子中,我们使用了一个名为createObject()的函数来创建对象。当我们调用createObject()函数时,它会创建一个新的空对象,并将一些属性添加到该对象中,然后返回该对象。我们可以调用createObject()函数多次来创建多个实例。

构造函数模式

构造函数模式是使用new关键字创建对象的一种重要方式,它是JavaScript中创建对象的标准模式之一。当使用new关键字调用构造函数时,JavaScript 会在内存中创建一个空对象,并将这个新创建的对象的原型指向该构造函数的原型。

下面是一个最简单的使用构造函数模式创建对象的示例:

function Person(name) {
  this.name = name;
}
var person1 = new Person("Bob");

在上面的例子中,我们定义了一个名为Person的构造函数,它接收一个参数name。当我们以new Person()的方式调用它时,JavaScript会在内存中创建一个空对象,并将这个新创建的对象的原型指向Person构造函数的原型。然后,Person内部的this指向这个新创建的对象,并将name属性添加到这个对象中。最后,Person 函数返回创建的这个新对象。

原型模式

原型模式是一种非常常见的创建对象的方式,它主要利用函数的原型属性来实现对象之间的继承和共享属性。我们可以向原型对象添加属性和方法,然后可以使用这个原型,来创建新实例对象并继承它的属性和方法。下面是一个最简单的原型模式的示例:

function Person() {}
Person.prototype.name = "Bob";
var person1 = new Person();
console.log(person1.name); // 输出 "Bob"

在上面的例子中,我们定义了一个名为Person的构造函数,并将name属性添加到其原型对象中。当我们使用new Person()创建一个新对象时,它会继承Person原型对象中的name属性。

混合模式

混合模式是将多种对象创建方式结合在一起的创建对象的方案,它可以实现更灵活、更复杂的对象结构。我们可以将工厂模式、构造函数模式和原型模式结合起来使用,来创建更加复杂的对象。

下面是一个使用混合模式创建对象的示例,该示例将一个对象转换为可监听的对象。该对象包括一个内部data对象,一个添加on, off, emit方法的模块以及一个使用原型链实现复制数据的方法:

function extend(obj, extension) {
  for (var key in extension) {
    obj[key] = extension[key];
  }
}

// 工厂模式创建内部对象
function createData() {
  return { };
}

// 构造函数模式创建监听器模块
function EventTarget() {
  this.listeners = { };
}
EventTarget.prototype.on = function(type, callback) {
  if (typeof this.listeners[type] === "undefined") {
      this.listeners[type] = [];
  }
  this.listeners[type].push(callback);
};
EventTarget.prototype.off = function(type, callback) {
  if (this.listeners[type] instanceof Array) {
      var listeners = this.listeners[type];
      for (var i = 0, len = listeners.length; i < len; i++) {
          if (listeners[i] === callback) {
              listeners.splice(i, 1);
              break;
          }
      }
  }
};
EventTarget.prototype.emit = function(type, e) {
  e = e || { };
  if (!e.target) {
      e.target = this;
  }
  if (this.listeners[type] instanceof Array) {
      var listeners = this.listeners[type];
      for (var i = 0, len = listeners.length; i < len; i++) {
          listeners[i].call(this, e);
      }
  }
};

// 原型模式创建拷贝数据方法
createData.prototype = {
  clone: function() {
      var clone = new createData();
      extend(clone, this);
      return clone;
  }
};

// 混合模式创建可监听对象
function createObservable() {
  var observable = createData();
  extend(observable, new EventTarget());
  extend(observable, createData.prototype);
  return observable;
}

// 使用混合模式创建对象
var observableData = createObservable();
observableData.on("change", function(e) {
  console.log("data changed.");
});

在上面的例子中,我们首先使用工厂模式创建了一个名为createData()的函数来创建一个空对象。然后,我们使用构造函数模式创建一个名为EventTarget()的函数来定义一个具有 on(), off(), emit()方法的模块。使用原型模式下我们为createData()函数添加了一个clone()方法。最后,我们使用混合模式创建名为createObservable()的函数。在该函数内,我们使用工厂模式创建一个新的对象,并将该对象扩展为具有EventTarget原型的克隆对象。最终返回新对象。

动态原型模式

动态原型模式是一种创建对象方法,其特点是在构造函数的原型上添加方法,这样,每次创建新实例对象的时候,这个方法才会被重新定义一次,从而避免重复定义。动态原型模式根据是否已经定义原型方法来决定是否创建方法。下面是一个最简单的使用动态原型模式创建对象的示例:

function Person(name) {
  this.name = name;
  if (typeof Person.prototype.sayName !== "function") {
    Person.prototype.sayName = function() {
      console.log(this.name);
    };
  }
}

var person1 = new Person("Bob");
person1.sayName(); // 输出 "Bob"

在上面的例子中,我们首先定义了一个名为 Person 的构造函数。我们通过判断原型上是否已经存在sayName()方法,来决定是否在原型上创建这个方法。实现了动态原型的特性。

至此,我们已经介绍了工厂模式、构造函数模式、原型模式、混合模式以及动态原型模式的基础概念和应用。通过不同的创建对象方式,我们可以创建出简单的、复杂的、可维护的对象,从而让JavaScript更加灵活、更加强大。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式) - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • js实现左右两侧浮动广告

    下面是关于“js实现左右两侧浮动广告”的完整攻略。 实现思路 我们首先需要确定广告层的定位方式,一般采用 position: fixed 来实现固定的效果。然后利用 JS 计算浏览器窗口的宽度,以及广告层的宽度,计算出广告层到浏览器窗口两侧的距离,以此确定广告层的位置。接着,我们需要监听浏览器窗口的 scroll 和 resize 事件,根据滚动的位置和窗口…

    JavaScript 2023年6月11日
    00
  • jQuery加密密码到cookie的实现代码

    要实现将加密密码存储到cookie的过程,需要进行以下步骤: 1. 引入jQuery插件 提供加密解密功能的jQuery插件有很多种,这里选择一个比较常用的插件:jquery.cookie。此插件可以方便地创建、读取和删除cookie。 <head> <script src="https://code.jquery.com/jqu…

    JavaScript 2023年6月11日
    00
  • 深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解

    深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解 什么是依赖倒置原则DIP? 依赖倒置原则(Dependency Inversion Principle,DIP)是S.O.L.I.D原则中的一个重要原则。该原则的核心思想是:高层模块不应该依赖于低层模块,二者都应该依赖于抽象接口。同时,抽象接口不应该依赖于具体实现,…

    JavaScript 2023年6月11日
    00
  • 日常收集整理的JavaScript常用函数方法

    下面是详细讲解“日常收集整理的JavaScript常用函数方法”的完整攻略: 日常收集整理的JavaScript常用函数方法 1. 概述 JavaScript是一门非常强大的编程语言,它广泛应用于前端开发、后端开发、移动应用开发等各个领域。在JavaScript的开发过程中,我们经常会遇到一些常用的函数和方法,这些函数和方法可以帮助我们更加有效地开发Java…

    JavaScript 2023年5月18日
    00
  • Javascript实现的SHA-256加密算法完整实例

    Javascript实现的SHA-256加密算法完整实例 SHA-256是一种常用的加密算法,可以对文本进行加密处理,被广泛应用于网络安全、密码学等领域。本文将介绍如何使用javascript语言实现SHA-256加密算法,并提供详细的完整代码实例。 一、SHA-256加密算法基础知识 SHA-256是一种基于哈希加密算法的加密方式,它可以将任意长度的输入信…

    JavaScript 2023年5月19日
    00
  • JS中取二维数组中最大值的方法汇总

    当我们需要在 JavaScript 中取二维数组中的最大值时,可能会遇到一些问题。下面我为大家详细讲解 JS 中取二维数组中最大值的方法汇总。 方法一:使用双重循环 这种方法比较直观,可以使用双重循环遍历整个二维数组,然后找到其中最大值。 function findMaxIn2DArray(arr) { let max = arr[0][0]; for (l…

    JavaScript 2023年5月27日
    00
  • Document对象内容集合(比较全)

    对于网站开发者而言,了解Document对象内容集合是相当重要的。这个集合包含了许多的内容,例如文档信息、头部信息、body信息、表单信息、链接信息、脚本等等,下面详细讲解一下。 一、Document信息(document信息集合) Document信息集合提供了一堆有关于文档的重要信息,其中包括文档的标题、URL、网页DOM、脚本代码、cookie、use…

    JavaScript 2023年6月11日
    00
  • javascript实现手机震动API代码

    很好,下面是详细讲解 JavaScript 实现手机震动 API 代码的完整攻略: 1. 确认浏览器支持性 首先需要确认浏览器是否支持 Vibration API(震动 API)。可以通过以下代码来检测: // 判断浏览器是否支持 Vibration API(震动 API) if ("vibrate" in navigator) { co…

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