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
詳細は「犀牛書」第十章をご覧ください.