1. 先复习一下Javascript中创建对象的几种方式

1)使用Object构造函数

var person = new Object();
person.name = "Nicholas";
person.age = 29;
person.job = "Software Engineer";
person.sayName = function(){
alert(this.name);
}

2) 使用对象字面量

var person = {
    name : "Nicholas",
    age : 29;
    job : "Software Engineer";
    sayName : function(){
        alert(this.name);
    }
};

3)工厂模式

function createPerson(name,age,job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
   alert(this.name);
}
return o;
}
var person1 = createPerson('Nicholas',29,'Software Engineer');
var person2 = createPerson('greg',27,'dortor');

4)构造函数模式:

function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
   alert(this.name);
}
}
var person1 = new Person('Nicholas',29,'Software Engineer');
var person2 = new Person('greg',27,'dortor');

5)原型模式

function Person(){
Person.prototype.name="Nicholas";
Person.prototype.age = 29;
Person.prototype.job = "Software Engineer";
Person.prototype.sayName = function(){
   alert(this.name);
}
}
var person1 = new Person();
person1.sayName(); //"Nicholas"
var person2 = new Person();
person2.sayName(); //"Nicholas"
alert(person1.sayName == person2.sayName); //true

5.1)更加简单的原型模式

为了减少不必要的输入,也为了从视觉上更好地封装原型的功能,用一个包含所有属性和方法的对象字面量来重写整个原型对象。[缺点]以这种方式重设constructor属性会导致它的[[Enumerable]]特性被设置为true,默认情况下原生的constructor属性是不可枚举的。

function Person(){};
Person.prototype = {
constructor: Person,
name : 'Nicholas',
age : 29,
job : 'Software Engineer',
sayName : function(){
   alert(this.name);
}
};

6)组合模式

组合使用构造函数模式和原型模式是创建自定义类型的最常见方式。构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。这种混成模式还支持向构造函数传递参数,是用来定义引用类型的一种默认模式

unction Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.friends = ["shelby","Court"];
}
Person.prototype = {
constructor: Person,
sayName : function(){
   alert(this.name);
}
}
var person1 = new Person('Nicholas',29,'Software Engineer');
var person2 = new Person('greg',27,'dortor');
person1.friends.push("van");
alert(person1.friends); // ["Shelby","Court","Van"];
alert(person2.friends) ;// ["shelby","Court"]
alert(person1.friends == person2.friends); //false
alert(person1.sayName == person2.sayName); //true

2. Node.js中的单例模式实现

单例类对象的创建使用的是上面第6种方式:组合模式

创建single_class.js,实现单例类,代码如下:

/* single_class.js */
var _instance = null ;//定义初始化_instance
module.exports = function(time){ //定义单例类
    function Class(time){
    this.name = "danhuang";
    this.book = 'Node.js';
    this.time = time;
    }
    Class.prototype = {
    constructor : Class,
    show : function(){
    console.log(this.book + ' is write by ' + this.name + ', time is ' + this.time);
    }
    }
    
    this.getInstance = function(){
    if (_instance === null){
    _instance = new Class(time);
    }
    return _instance;
    }    
}

【代码说明】:

var _instance = null : 存储Class对象

function Class(time)和Class.prototype : 创建Class类和方法

this.getInstance = function(){} : 获取单例对象接口。

注意,_instance变量要放在单例方法之外,否则将无法实现单例模式。原因是当调用单例方法时每次都会重新将其赋值为null,而放在单例函数之外时,调用单例函数不会影响到_instancce变量的值。

接下来创建调用验证single_class.js。代码如下:

/*single_app.js*/
var Single = require('./single_class');

var singleObj1 = new Single('2012-11-10');
var singleClass1 = singleObj1.getInstance();
singleClass1.show();

var singleObj2 = new Single('2012-11-20');
var singleClass2 = singleObj2.getInstance();
singleClass2.show();

【代码说明】

var Single = require('./single_class'); 获取单例类

var singleObj1 = new Single('2012-11-10'); // new 一个新的单例类对象,并设置时间

var singleClass1 = singleObj1.getInstance(); //获取Class类的对象

singleClass1.show():// 调用Class类对象的方法

【运行结果】

Node.js is write by danhuang, time is 2012-11-10
Node.js is write by danhuang, time is 2012-11-10

可以看到,SingleObj1和SingleObj2是一样的,只是在new对象的时候传递的时间不同。这个时间主要用来判断是否new了新的对象。

Node.js单例模式相关推荐

  1. Node.js~ioredis处理耗时请求时连接数瀑增

    关于redis连接数过高的解释 对于node.js开发环境里,使用传统的redis或者使用ioredis都是不错的选择,而在处理大数据请求程中,偶尔出现了连接池( redis服务端的最大可用连接数,默 ...

  2. 《Node.js开发实战详解》学习笔记

    <Node.js开发实战详解>学习笔记 --持续更新中 一.NodeJS设计模式 1 . 单例模式 顾名思义,单例就是保证一个类只有一个实例,实现的方法是,先判断实例是否存在,如果存在则直 ...

  3. node.js - 收藏集

    如何部署 Node.js 应用 - 后端 - 掘金 当你熟悉 Node.js 之后很可能会自己写些小东西放在 VPS 上跑,比如说一个个人的 API 服务,或者是你的网站.这篇文章分享的内容不管你的 ...

  4. Node.js常见面试题

    Node.js常见面试题 1.NodeJS中的this为什么是一个空对象? 2.NodeJS中为什么可以直接使用exports.require.module.__filename.__dirname? ...

  5. JavaScript 的进阶学习 (Node.js)_01

    Node的学习 Node.js 是一个基于 Google 所开发的浏览器 Chrome V8 引擎的 JavaScript 运行环境. 属于 服务端的 JavaScript . 2019.03.01 ...

  6. node JS獲取GPS_「前端篇」node_modules 困境

    作者: 杨健 转发连接:https://mp.weixin.qq.com/s/GCfv-Hshw4N2fCKVvAi6Kg 本文已经过原作者 杨健 转载授权,原文请点击阅读全文查看. Ryan 对于 ...

  7. Node.js 简单入门

    目录 一. 什么是Nodejs 二. Nodejs组成图(对比jdk) 三. Nodejs的安装 四. 第一个Nodejs程序 五. Node实现请求响应 六. Node操作MYSQL数据库 1. 安 ...

  8. node.js(node.js+mongoose小案例)_实现简单的注册登录退出

    一.前言 通过node.js基本知识对node.js基本知识的一个简单应用 1.注册 2.登录 3.退出 二.基本内容 1.项目结构搭建如图所示 2.这个小案列中用到了art-template子模板以 ...

  9. 在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查

    Sequelize是一个基于promise的关系型数据库ORM框架,这个库完全采用JavaScript开发并且能够用在Node.JS环境中,易于使用,支持多SQL方言(dialect),.它当前支持M ...

  10. [转]Getting Start With Node.JS Tools For Visual Studio

    本文转自:http://www.c-sharpcorner.com/UploadFile/g_arora/getting-started-with-node-js-tools-for-visual-s ...

最新文章

  1. 卷积网络基础知识---Depthwise Convolution Pointwise Convolution Separable Convolution
  2. select2 使用
  3. Waymo无人卡车高调重返凤凰城,但货运先机已失
  4. Windows Server 2012 R2/2016/2019无法安装.NET Framework 3.5.1或语言包的解决方法
  5. DEAP:使用生理信号进行情绪分析的数据库(二、实验设计与主观分析)
  6. Sublime Text 快捷键
  7. Java如何读指定行
  8. 畅游互联的API接口如何对接到自己的网站上?
  9. 本机mysql无法进行碎片整理有什么用,试试mysql数据碎片整理吧解决astgo经常死机变慢的问题...
  10. 用于Linux系统/网络管理的nmap命令的实例
  11. 第九周 单片机的定时器与计数器 模式寄存器TMOD 控制寄存器TCON
  12. 微信小程序-获取当前城市位置经纬度,并解析位置信息
  13. 金仓数据库KingbaseES客户端连接问题
  14. Flutter3.0导入english_words报错flutter\packages\flutter_tools\gradle\flutter.gradle‘ 行: 1156
  15. 深色背景黑底白字,蓝底白字课件材料“洗白”打印,ps批处理教程
  16. Excel VBA基础教程
  17. UED、UCD、UE、UI、交互设计这 5 个名词有哪些区别?
  18. 详解插帧算法DAIN论文和代码(Depth-Aware Video Frame Interpolation)
  19. Mac 重命名快捷键
  20. MindMapper屏幕捕获功能该如何使用

热门文章

  1. 360极速浏览器如何设置ie8兼容模式
  2. rpm 如何安装mysql_如何使用rpm安装MySQL
  3. Vue中使用axio跨域请求外部WebService接口
  4. Node.js 整合 Express 框架实现微信支付和支付宝支付
  5. 图表有很多,你用对了么?
  6. 以太坊存储项目Swarm (代币bzz)1.0 主网正式上线
  7. 计算机主机有异响,电脑主机有异响怎么办?电脑主板有异响的原因和解决方法...
  8. Office WPS如何在页眉页脚添加一条横线
  9. CSS解读之box-sizing属性
  10. 理论+实验:Apache网页与安全优化(网页压缩、网页缓存、隐藏版本信息、网页图片防盗链)