[英]How to append to a JavaScript namespace created from a closure?
我有以下格式的名称空间,允许公共和私人成员:
function A() {
return('a');
}
namespace1 = (function () {
// private
namespace2 = (function() {
// private
prC = function () {
return(namespace1.puB() + 'c');
};
puC = function () {
return(prC());
};
// public
return({
puC: puC
});
})();
prB = function () {
return(A() + 'b');
};
puB = function () {
return(prB());
};
// public
return({
puB: puB,
namespace2: namespace2
});
})();
document.write('A() = '); try { document.write(A()); } catch (ex) { document.write('inaccessible'); }
document.write('<BR />');
document.write('namespace1.prB() = '); try { document.write(namespace1.prB()); } catch (ex) { document.write('inaccessible'); }
document.write('<BR />');
document.write('namespace1.puB() = '); try { document.write(namespace1.puB()); } catch (ex) { document.write('inaccessible'); }
document.write('<BR />');
document.write('namespace1.namespace2.prC() = '); try { document.write(namespace1.namespace2.prC()); } catch (ex) { document.write('inaccessible'); }
document.write('<BR />');
document.write('namespace1.namespace2.puC() = '); try { document.write(namespace1.namespace2.puC()); } catch (ex) { document.write('inaccessible'); }
输出:
A() = a
namespace1.prB() = inaccessible
namespace1.puB() = ab
namespace1.namespace2.prC() = inaccessible
namespace1.namespace2.puC() = abc
我该如何将公共成员和私有成员都附加到这样的名称空间(即:来自不同文件)?
“我该如何将公共和私有成员都附加到这样的名称空间...”
好吧,您的函数是公开的,因为您没有使用var
正确声明变量。
但是,一旦修复此问题,就可以从任何可以引用您的namespace
对象的代码中添加更多公开的属性(因为所有属性都公开) 。
添加更多引用本地(私有术语)的属性,您需要一个新的函数和变量作用域。
只需调用引用namespace
对象的函数,在该函数内部创建一些函数,然后添加引用那些局部函数的属性即可。
// Other file
(function() {
var newLocalFunc = function() {
// local function
}
var anotherLocalFunc = function() {
// local function
}
namespace1.exposedFunc = function() {
return newLocalFunc()
}
namespace1.namespace2.anotherExposedFunc = function() {
return anotherLocalFunc()
}
})();
再说一次...不要忘记在原始代码中将var
放在变量之前。
没有var
关键字声明的任何变量都在全局范围内 。 因此,您的puB()
函数不是不可访问的或私有的,它只是不是namespace1
函数返回的对象的成员。 例如,尝试window.prB()
,您将看到该方法存在于window
对象的全局范围内。
<head>
<script type="text/javascript">
obj1 = {}; //in global scope
var obj2 = {}; //in global scope. Although used the var keyword, this line itself is in the global scope; so the variable.
function someFunc() {
obj3 = {}; //in global scope
var obj4 = {}; //'so-called' private (inaccessible from global scope)
}
</script>
</head>
为了将两个不同的JS文件合并在同一个“命名空间”(或者说对象)下:
文件1 .js
var namespace1 = (function() {
// some code...
var namespace2 = (function() {
// some code...
return {
obj2: 'value2'
};
})();
return {
obj1: 'value1'
};
})();
文件2 .js
namespace1.namespace3 = (function() {
// some code...
var ns4 = (function() {
// some code...
return {
obj4: 'value4'
};
})();
return {
obj3: 'value3',
namespace4: ns4
};
})();
什么是什么:
namespace1
在全局范围内声明; 因此可以从任何地方访问它,这是我们的主要对象。 namespace2
是不可访问的(私有)。 namespace3
在全局范围内不可访问,但可以作为namespace1
的成员进行访问; 例如: namespace1.namespace3
。 namespace4
可作为namespace1
的成员进行访问。 例如: namespace1.namespace4
。 所以; 我们的主要对象namespace1
的成员是:
namespace1 = {
obj1: String,
namespace3: {
obj3: String,
namespace4: {
obj4: String
}
}
};
您距堪萨斯州很远,在这里。
您不能“声明”为公开或私有的内容。
只要您在函数内部定义事物,然后选择返回特定事物,或将它们附加到作为参数传入的对象/数组中,那么在执行完这些操作之后,您将具有“公共”(外部)访问权限函数返回。
为了具有“私有”访问权限,您返回了一个在内部引用某些内容的函数。
var Wallet = function (amount, overdraft_limit) {
var balance = 0,
overdraft = overdraft_limit || 0,
deposit_funds = function (funds) { balance += funds; return true; },
withdraw_funds = function (request) {
var funds = 0;
balance -= request;
funds = request;
return funds;
},
validate_request = function (pin) { /* ... */ },
sufficient_funds = function (val) { return val <= (balance + overdraft); },
add = function (pin, deposit) {
if (!validate_request(pin) || deposit <= 0) { return false; }
var result = deposit_funds(deposit);
return result;
},
deduct = function (pin, withdrawl) {
if (!validate_request(pin) || withdrawl <= 0) { return false; }
if (!sufficient_funds(withdrawl)) { return false; }
var funds = withdraw_funds(withdrawl);
return funds;
},
check = function () { return balance; },
public_interface = { deduct : deduct, add : add, check : check };
return public_interface;
};
var myWallet = Wallet(30, 20);
var cash = myWallet.deduct(40);
cash; // 40
myWallet.check(); // -10
myWallet.balance = 40000000000;
cash = myWallet.deduct(4000);
cash; // === false
通过在我的“构造函数”内部构建可以访问balance
函数,我返回该“公共”对象的变量可以调用与“私有”数据进行交互的方法,但是无法通过任何方法访问或修改它方法,但要使用那些“公共”功能。
使用IIFE将这些东西嵌套8层,使用了我刚刚演示过的完全相同的封闭概念。
明确决定要返回什么,不返回什么。
您发送给世界的功能是public
。 函数内部的未返回或未附加到对象的函数/ etc是私有的。
它们已通过返回的“构造函数”函数关闭,现在它们是100%无法访问的,除非使用在构造函数内部构建的,引用私有var并作为公共方法返回的函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.