javascriptモジュールと名前空間(Module and namespace)について

2827 ワード

私達はプロジェクトをして一つのModuleとして、各場所で実行できるようにするには、グローバル変数global variablesとグローバル関数global functionを定義することを避ける必要があります.だから、自分のすべてのvariablesとfunctionsをempy ojectの属性または方法に変えます.
// Create an empty object as our namespace
// This single global symbol will hold all of our other symbols
var Module;
if(Module && (typeof Module != "object" || Module.Name))
	throw new Error("Namespace 'Module' already exists");
Module = {};

// Define all variables and functions within the namespace
Module.max = 10;
Module.define = function(){ /* code goes here*/}
Module.provides = function(o, c){ /*code goes here*/}
Module.sayHi = function(){ /* code goes here*/}
このように必要な時に、私達はもとはsayHi()を書きます.今はModule.sayHi()を書きます.
また、現在流行しているのは、プライベートの名前空間と役割領域としてクローズドバックを使用してプライベート名前空間を作成し、共有方法を共有の名前空間に導き出すことである.
例のように:
// Create the namespace object. Error checking omitted here brevity
// Instead of using com.davidflanagan.Class
// we can also simply say var Module={} as the example above
// the reason to use com.davidflanagan.Class is just 100% ensure the name is UNIQUE
var com;
if(!com) com = {};
if(!com.davidflanagan) com.davidflanagan = {};			
com.davidflanagan.Class = {};

// Don't stick anything into the namespace directly
// Instead we define and invoke an anonymous function to create a closure
// that serves as our private namespace. This function will export its
// public symbols from the closure into the Module object
// Note that we use an unnamed function so we don't create any other global symbols
(function(){ // Begin anonymous function definition
	// Nested functions create symbols within the closure
	function define(data) {counter+=data; /* more code here*/}
	function provides(o, c) { /* code here*/}
	
	// local variable are symbols within the closure
	// This one will remain private within the closure
	var counter = 0;
	function localMethod(){ return "This is local method"};
	console.log(localMethod()); // This is local method
	
	// This function can refer to the variable with a simple name
	// instead of having to qualify it with a namespace
	function getCounter(){ return counter;}
	
	// Now that we will defined the properties we want in our private closure
	// we can export the public ones to the public namespace
	// and leave the private ones hidden here.
	var ns = com.davidflanagan.Class;
	
	// Define all variables and functions within the namespace
	ns.define = define;
	ns.provides = provides;
	ns.getCounter = getCounter;
})(); // End anonymours function definition and invoke it

com.davidflanagan.Class.define(5);
console.log(com.davidflanagan.Class.getCounter()); // 5
console.log(com.davidflanagan.Class.localMethod()); // ERROR      private function  export     
詳細は「犀牛書」第十章をご覧ください.