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日

相关文章

  • JavaScript输入分钟、秒倒计时技巧总结(附代码)

    我来详细讲解“JavaScript输入分钟、秒倒计时技巧总结(附代码)”的完整攻略。 概述 本文主要介绍如何利用JavaScript实现分钟、秒倒计时,并提供了相关的代码示例和解释。读者可以根据自己的需求进行参考和修改,具体实现过程可以参考下文。 实现思路 主要实现过程是利用setInterval()函数和JavaScript DOM,通过获取输入的分钟和秒…

    JavaScript 2023年5月27日
    00
  • JavaScript程序开发之JS代码放置的位置

    JavaScript程序开发中,JS代码的放置位置主要有内部JS和外部JS两种方式。下面将详细讲解这两种方式的使用方法及注意事项。 一、内部JS 内部JS是将JS代码直接嵌入到HTML文档中的一种方式。我们可以通过<script>标签来实现内部JS的操作。 下面是一个简单的内部JS示例: <!DOCTYPE html> <htm…

    JavaScript 2023年5月27日
    00
  • asp(JavaScript)自动判断网页编码并转换的代码

    为了实现ASP(JavaScript)自动判断网页编码并转换的代码,我们需要进行以下步骤: 获取网页内容 我们可以使用XMLHttpRequest对象获取网页内容,具体代码如下: var xhr = new XMLHttpRequest(); xhr.open(‘GET’, url, true); xhr.onreadystatechange = funct…

    JavaScript 2023年5月20日
    00
  • javascript中AJAX用法实例分析

    JavaScript中AJAX用法实例分析 AJAX(Asynchronous JavaScript And XML),即异步JavaScript与XML。JavaScript通过XMLHttpRequest对象来向服务器发异步请求,从服务器获得数据,并更新网页,而不用在页面加载时刷新整个页面。 AJAX的基本用法 创建XMLHttpRequest对象 XM…

    JavaScript 2023年6月11日
    00
  • 从零开始用electron手撸一个截屏工具的示例代码

    下面是从零开始用Electron手撸一个截屏工具的示例代码的攻略: 创建一个Electron项目 首先,我们需要使用npm来创建一个空的Electron项目,可以使用以下命令: npm init -y npm install electron –save-dev 安装完成后,我们需要在package.json文件中添加一个start script: &qu…

    JavaScript 2023年6月11日
    00
  • JS实现轮播图小案例

    JS实现轮播图小案例的攻略如下: 1. 设计HTML结构 在页面上设计轮播图的HTML结构,通常采用ul标签加li标签的方式,li标签内嵌套img标签。同时也可以添加左右切换箭头、小圆点等控件。 示例代码: <div class="slider"> <ul class="slider-list"&gt…

    JavaScript 2023年6月11日
    00
  • 如何使用JS console.log()技巧提高工作效率

    如何使用JS console.log()技巧提高工作效率 JavaScript 是前端开发必不可少的一门语言,而 console.log() 是 JS 里常用的调试工具。在这里,我们将从几个方面介绍如何使用 console.log() 技巧提高工作效率。 1. console.log()基本使用 console.log() 不仅仅只是打印一些信息。在开发过程…

    JavaScript 2023年5月28日
    00
  • js 原型对象和原型链理解

    JS 原型对象和原型链理解 在 JavaScript 中,每个对象都有一个内部属性 [[Prototype]],也可以叫做原型,它指向另一个对象,而后者则有自己的原型,这样就形成了一个链接的原型链。最终的原型指向 null。 原型对象 原型对象是函数对象的一个属性 prototype,它是一个对象,包含了一些属性和方法,这些属性和方法会被实例对象所继承。每当…

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