requirejs定义的模块返回的永远是单例对象,可以借助javascript中的类解决模块间的相互干扰问题

RequireJS中定义一个模块,总的来说有2种方式:简单键值对和函数依赖式。

1.简单键值对:一个模块仅含有值对,没有任何依赖

define({
    color: "black",
    size: 1,
    method1: function() {},
    method2: function() {}
});

这种写法虽然简单,但是有很大的局限性,仅仅是定义了该模块的返回值,不能做一些额外的初始化工作。

通过下面下面这种方式来定义模块,灵活性更高,我们可以在函数体内写一些模块初始化的代码。

define(function () {

    //Do initial work here

    return {
        method1: function() {},
        method2: function() {}
    };
});

2.函数依赖式:则第一个参数是依赖的名称数组;第二个参数是回调函数。

在模块的所有依赖加载完毕后,回调函数会被调用来定义该模块。

define(["module1"], function(moudle1) {

		function calc()
		{
			return moudle1.val;
		}

		return {"get":calc};
    }
);

这2种定义模块的方式是等价的,requirejs能够保证一个模块只会被加载一次,所以如果A、B模块都依赖于C模块,那么其实A和B模块使用的都是同一个对象。

//C模块
define([],function(){

	var count = 0;

	function sayCount()
	{
		count++;
		return count;
	}

	return {"say":sayCount};

});

// A模块
require(['C'],
  function(module) {
         cosole.log(module.say());//1
});

// B模块
require(['C'],
  function(module) {
		cosole.log(module.say());//2
});

如果我们定义了一个模块,很多时候我们希望它能够被多个模块使用而不会相互干扰。

//C模块
define([],function(){

 // 定义一个类
 function DemoClass()
 {
	var count = 0;
	this.say = function(){
		count++;
		return count;
	};
 }

 return function(){
	//每次都返回一个新对象
	return new DemoClass();
 };

});

// A模块
require(['C'],
  function(module) {
         cosole.log(module().say());//1
});

// B模块
require(['C'],
  function(module) {
		cosole.log(module().say());//1
});

每次调用模块C,返回都是一个新的对象,通过这种方式能够避免A和B模块在使用模块C时候的干扰和冲突。

时间: 2024-08-01 06:41:23

requirejs定义的模块返回的永远是单例对象,可以借助javascript中的类解决模块间的相互干扰问题的相关文章

javascript基础知识-类和模块

在JavaScript中可以定义对象的类,让每个对象都共享这些属性. 在JavaScript中,类的实现是基于其原型继承机制的.如果两个实例都从同一个原型对象上继承了属性,我们就说它们是同一个类的实例. JavaScript中有一个重要特性是"动态可继承"(dynamically extendable),笔记之后再做. 为什么要定义类:定义类是模块开发和重用代码的有效方式之一. 1)类和原型 在JavaScript中,类的所有实例对象都从一个原型对象上继承属性.因此,源性对象是类的核心

第九章:Javascript类和模块

(过年了,祝大家新年好!) 第6章详细介绍了javascript对象,每个javascript对象都是一个属性集合,相互之间没有任何联系.在javascript中也可以定义对象的类,让每个对象都共享某些属性,这种“共享”的特性是非常有用的.类的成员或实例都包含一些属性,用以存放它们的状态,其中有些属性定义了它们的行为(通常称为方法).这些行为通常是由类定义的,而且为所有实例所共享.例如,假如有一个名为complex的类用来表示复数,同时还定义了一些复数运算.一个complex实例应当包含复数的实

JavaScript 模块化入门Ⅰ:理解模块

作为一名JS初学者.假如你听到了一些诸如"模块化构建&模块化载入" "Webpack&Browserify" 或者 "AMD&CMD"之类的术语,肯定瞬间就凌乱了. JavaScript的模块化听起来挺深奥,可其实理解它对开发者来说特别实用. 在这篇文章里,我会尽量深入浅出地把这些深奥的术语翻译成浅显易懂的人话(加上一些代码示例).希望你多少能从中学到点东西. 为了避免长篇大论,整个内容会分为两篇文章,这是第一部分,主要介

JavaScript类和模块

类 在JavaScript中,类的实现是基于原型继承机制的.如果两个实例都从同一个原型对象上继承了属性,我们说它们是同一个类的实例. 构造函数 从某种意义上讲,定义构造函数即是定义类,所以构造函数名首字母要大写,而普通的函数都是首字母小写. // 构造函数,首字母大写 // 注意,这里并没有创建并返回一个对象,仅仅是初始化 function Range(from , to) { // 添加2个属性,这2个属性是不可继承的,每个对象都拥有唯一的属性 this.from = from; this.t

Node中的包和模块

一.模块和包 概念:模块(Module)和包(Package)是Node.js最重要的支柱.开发一个具有一定规模的程序不可能只用一个文件,通常需要把各个功能拆分.分装.然后组合起来.模块正式为了实现这种方式而诞生,在浏览器JavaScript中,脚本模块的拆分和组合通常使用HTML的script标签来实现,Node.js提供了require函数来调用其他模块,而且模块都是基于文件,机制非常简单,模块和包的区别是透明的,因此经常不作区分. 模块 1.什么是模块 模块和文件是一一对应的.一个Node

一篇文章带你了解JavaScript中的函数表达式,递归,闭包,变量,this对象,模块作用域

作者 | Jeskson 来源 | 达达前端小酒馆 定义函数的方式: 第一种为 函数声明: 第二种为 函数表达式. 语法: function functionName(arg0, arg1, arg2) { // 函数体 } 在Firefox,Safari,Chrome和Opera有效: 就是通过这个属性可以访问到这个函数指定的名字. console.log(functionName.name); // 'functionName' 函数声明: 它的一个重要特点就是:函数声明提升,就是在执行代码

JavaScript权威指南第09章 类和模块

类和模块 类的实现是基于继承机制的,如果两个类继承同一个原型对象,那么也就是说,也就意味着使用同一个构造函数来实例化,它们是同一个类的实例. 9.1类和原型 在javascript中,类的实例都是从同一个原型对象上继承属性,所以原型对象是类的核心. 9.2类和构造函数 构造函数是初始化新创建对象的函数. 构造函数的prototype属性被用作新对象的原型,因此,同一个构造函数的实例化的对象都继承自同一个对象. 9.3javasript中的java式的类继承 实例字段 实例方法 类字段 类方法 9

Requirejs定义模块

模块可以很好的定义作用域来避免全局名称空间污染,它可以显示的定义出函数间的依赖关系,而不需要引用全局变量. RequireJS可以加载多个不同的模块,虽然加载的顺序不一样,但是能保证依赖的顺序是正确的. 1.  当模块中只有键值对时,可通过如下方式定义. define({     name : "beautiful",     color: "yellow",     size: "3M"}); 2. 当模块中没有依赖,只有函数时,模块的格式如下

WireMock之定义状态控制返回

WireMock之定义状态控制返回 定义操作习惯 可以定义一个场景,然后通过状态来控制每次请求返回的内容 基本语法,初始状态总是为Started XXX.inScenario("Scenario") .whenScenarioStateIs("Started") .willSetStateTo("NewStatus")); XXX.inScenario("Scenario") .whenScenarioStateIs(&quo