let Obj= {
"name": "Ceall"
}
// 全域變數
var MYAPP = {}
//變數
MYAPP.car = ''
// function
MYAPP.fn = function(){};
// Mudules
MYAPP.modules = {}
MYAP.modules.module1 = {}
MYAP.modules.module2 = {}
var MYAPP = MYAPP || {};
MYAPP.namespace('MYAPP.a') // MYAPP.a
MYAPP.namespace('a.b.c') // MYAPP.a.b.c
MYAPP.namespace = function(ns_string){
let parts = ns_string.split("."),
parent = MYAPP,
i;
if(parts[0] === "MYAPP"){
parts = parts.slice(1)
}
for(i = 0; i < parts.length; i++){
if(typeof parent[parts[i]] === "undefined"){
parent[parts[i]] = {}
}
parent = parent[parts[i]]
}
return parent
}
原則: 若變數名稱存在, 則保留目前資料內容,
若不存在, 則建立一個空物件給予新變數
function Sandbox(){
//將參數列轉為陣列
var args = Array.prototype.slice.call(arguments),
// 最後一個參數是callback function
callback = args.pop(),
// 模組可以用陣列方式傳遞, 也可以用個別參數傳入
modules = (args[0] && typeof args[0] === "string") ? args : args[0],
i;
// 先確保此函式是以建構式方式呼叫
if(!(this instanceof Sandbox)){
return new Sandbox(modules, callback);
}
// 依照需要為this增加屬性
this.a = 1;
this.b = 2;
// 現在,將模組新增至盒新的this物件
// 沒有指定模組, 或者"*"都表示「使用所有模組」
if(!modules || modules === '*'){
modules = [];
for(i in Sandbox.modules){
if(Sandbox.modules.hasOwnProperty(i)){
modules.push(i);
}
}
}
// 初始所需的模組
for(i = 0; i < modules.length; i += 1){
Sandbox.modules[modules[i]](this);
}
callback(this);
}
// 依照需要建立prototype的屬性
Sandbox.prototype = {
name: "My Application",
version: "1.0",
getName: function(){
return this.name;
}
};
//沙盒模式 看起來像是
new Sandbox(function (box){
// 你的程式碼
// box是最初始的沙盒物件
})
// 使用擴增模組
Sandbox ('ajax','dom',function (box){
// 使用dom和ajax模組
// 此時沙盒物件, box, 已可使用'ajax', 'dom'兩個模組的屬性與方法
console.log(box);
})
Sandbox (['ajax', 'dom'], function (box){
console.log(box);
})
// 建立沙盒模組
Sandbox.modules = {};
Sandbox.modules.dom = function (box){
box.geElement = function (){};
box.getStyle = function (){};
box.foo = "bar";
}
Sandbox.modules.ajax = function (box){
box.makeRequest = function (){};
box.getResponse = function (){};
}
// public成員
var obj = {
prop: 1,
method: function(){
return "test"
}
}
console.log(obj.prop) //prop 可被public存取
console.log(obj.method()) //method 可被public存取
// private建構式範例
function fn(){
// private成員
var data = 0
this.getData = function(){
return data
}
}
var test = new getData();
console.log(fn.data) // undefined, data是private
console.log(fn.getData) // 0, public方法可存取data
// private物件實字範例
var myData;
(function getData(){
// private成員
var data = 0
// 實作public
myData = {
// 特權方式
getData: function(){
return data
}
}
})()
myData.getData() // 0
function Gadget(){
//private 成員
var name = 'iPod';
//public 方法
this.getName = function(){
return name;
}
}
Gadget.prototype = (function(){
//private成員
var browser = 'Mobile'
//public的prototype成員
return {
getBrowser: function(){
return browser
}
}
})()
var toy = new Gadget();
console.log(toy.getName()) // '自己的'特權方法
console.log(toy.getBrowser()) //prototype的特權方法
優點: 所有相同的建構式都可以共享prototype 內的屬性與方法, 節省記憶體
//建構式
var Gadget = function(){}
//一個靜態方法
Gadget.isShiny = function(){
return "you bet";
}
//加入原型的方法
Gadget.prototype.setPrice = function(price){
tihs.price = price;
}
// 測試
//呼叫靜態方法
Gadget.isShiny(); // "you bet"
// 建立一個實體, 然後呼叫方法
var iphone = new Gadget();
iphone.setPrice(500);
typeof Gadget.setPrice; // "undefined", 無法用靜態方式呼叫實體方法
typeof iphone.isShiny; // "undefined", 無法實體呼叫靜態方法