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

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

工厂模式

工厂模式用于创建同一类型对象的方式,这种方式隐藏了对象创建的复杂性,避免了使用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程序中美元符号$是什么

    美元符号 $ 在 JavaScript 中代表一个函数或对象。在 jQuery 库中,$ 代表 jQuery 函数,因此 $ 变得非常常见。在许多网站和 Web 应用程序中,如果你想使用 jQuery 库中的函数,则必须首先使用 $ 变量。下面是一个示例代码片段: $(document).ready(function(){ $("button&qu…

    JavaScript 2023年6月10日
    00
  • 基于React路由跳转的几种方式

    根据你的需求,我会简要介绍一下关于基于React路由跳转的几种方式,并提供两个实例说明。 1. React Router React Router 是一个开源库,可以帮助我们创建单页应用。它可以轻松管理路由,并帮助我们构建动态 UI。React Router 的基本用法如下: import { BrowserRouter as Router, Route, …

    JavaScript 2023年6月11日
    00
  • asp.net下模态对话框关闭之后继续执行服务器端代码的问题

    ASP.NET下模态对话框关闭之后继续执行服务器端代码的问题,可以通过以下方式实现: 1. 使用JavaScript和AJAX 在模态对话框中的“确认”或“取消”按钮中添加JavaScript代码,利用 AJAX 技术向服务器发送请求,通知服务器对话框已经被关闭,同时执行需要执行的服务器端代码。以下是示例代码: function CloseModal() {…

    JavaScript 2023年6月11日
    00
  • JQuery 动态扩展对象之另类视角

    JQuery 动态扩展对象之另类视角 在 Javascript 中,对象是一种灵活的数据类型,可以随意添加、删除、修改属性。JQuery 作为一个基于 Javascript 的库,提供了很多方便的方法和 API,其中一个非常常用的功能就是动态扩展对象。这篇文章将介绍 JQuery 中动态扩展对象的另一种视角,希望对初学者来说有所帮助。 对象的动态扩展 在 J…

    JavaScript 2023年6月10日
    00
  • js实现鼠标悬浮框效果

    JavaScript 实现鼠标悬浮框效果的过程主要分为以下几步: 1. 创建 HTML 结构 首先需要在 HTML 中定义框架,例如容器、容器内的内容、触发事件的 DOM 元素等。其中包含一个容器作为悬浮框,在鼠标触发事件后自动显示,同时鼠标移出事件后自动隐藏。 例如: <div class="parent"> <but…

    JavaScript 2023年6月11日
    00
  • 详解cesium实现大批量POI点位聚合渲染优化方案

    详解cesium实现大批量POI点位聚合渲染优化方案 概述 随着互联网和移动设备的普及,地理信息系统(GIS)以及地理数据的使用越来越广泛。在GIS应用开发中,矢量数据展示常常使用散点图,而在数据量较大的情况下,需要对散点进行聚合来达到优化效果。在本文中,我们将详细介绍如何使用cesium实现大批量POI点位聚合渲染优化方案。 cesium点位聚合原理 常见…

    JavaScript 2023年6月11日
    00
  • 解析ajaxFileUpload 异步上传文件简单使用

    解析ajaxFileUpload 异步上传文件简单使用攻略 异步上传文件简介 在传统的表单提交中,如果需要上传文件,则需要重新加载整个页面,用户体验并不好,而且上传大文件还会影响页面的响应速度。而异步上传则是采用ajax技术,实现上传文件的同时不刷新整个页面,从而提升用户体验。 ajaxFileUpload 简介 在实现异步上传功能的过程中,ajaxFile…

    JavaScript 2023年6月11日
    00
  • DOM操作一些常用的属性汇总

    DOM(文档对象模型)操作是前端开发中非常重要的一环,掌握 DOM 操作能够帮助我们轻松地对 HTML 页面进行修改和交互。 以下是一些常用的 DOM 属性汇总: 获取元素 我们常常需要找到特定的 HTML 元素并进行修改,这时就需要用到 DOM 获取元素的方法。 getElementById 通过元素的 ID 获取特定元素。 const element =…

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