lam*_*ade 3 javascript module-pattern revealing-module-pattern
我试图了解(显示)模块模式中public属性的工作方式。卡尔·丹利(Carl Danley)提出的“ 显露模块模式 ”的优点是:
明确定义的公共方法和变量,可提高可读性
让我们看一下这段代码(fiddle):
var a = function() {
var _private = null;
var _public = null;
function init() {
_private = 'private';
_public = 'public';
}
function getPrivate() {
return _private;
}
return {
_public : _public,
init : init,
getPrivate : getPrivate,
}
}();
a.init();
console.log( a._public ); // null
console.log( a.getPrivate() ); // "private"
Run Code Online (Sandbox Code Playgroud)
null调用时返回a._public。我现在可以操纵该公共财产,例如a._public = 'public';。但是我不能从对象内部更改它。或至少这些更改没有通过。我有点期待它"public"是由init-method之前更新的。
这是否真的意味着我没有任何方法可以处理公共属性?那么,这种模式的公共财产就没有意义了,对吧?我也尝试过这个没有运气(小提琴):
return {
_pubic : _public,
init2 : function() {
_public = 'public';
}
}
Run Code Online (Sandbox Code Playgroud)
最后但并非最不重要的一点是,我对整个return陈述有疑问。为什么不能只使用return this;公开所有内容?就像this自调用函数的上下文一样,它不应该只是在其中返回所有信息吗?为什么我必须创建另一个返回的对象?在这个小提琴中,它返回window对象。
这是否真的意味着我没有任何方法可以处理公共属性?
不,这意味着您不能具有公共变量。var _public是一个变量,无法从外部访问,并且在修改私有变量时,该变量不会反映在您的公共._public财产中。
如果要公开,请使用属性:
var a = function() {
var _private = null;
function init() {
_private = 'private';
this._public = 'public';
}
function getPrivate() {
return _private;
}
return {
_public : null,
init : init,
getPrivate : getPrivate,
}
}();
Run Code Online (Sandbox Code Playgroud)
我可以操纵该公共财产,例如a._public ='public';。但是我不能从对象内部更改它。
您可以this在对象的方法中使用,如上所示。或者您可以使用a引用对象,或者甚至可以存储对返回对象的本地引用。看到这里的差异。
或至少这些更改没有通过
是的,因为变量与属性不同(与Java等其他语言不同,全局语言除外)。导出public: _public对象文字时,它仅从_public变量中获取当前值,并在该对象上创建属性。没有对变量的持久引用,对一个变量的更改不会反映在另一个变量中。
为什么不能只使用
return this;公开所有内容?因为这应该是自调用函数的上下文,所以它不应该仅在其中返回所有信息吗?
变量是JavaScript 范围的一部分。(除了全局范围之外)这些范围不是该语言可访问的对象。
该this关键字并不是指函数的这个范围,但到被呼叫提供的上下文。这可以是方法调用中的基本引用,也可以是构造函数调用中的新实例,或者像您的基本函数调用(或window处于松散模式下的全局对象)中的任何内容一样。
在您的模块定义中,_public是按值复制的,因为在 javascript 中,只有对象是按引用分配的。之后它就没有任何指向本地 _public 变量的链接。因此,这只有在您将对象中的 _public“装箱”,以便通过引用复制,或者您在模块中也引用对象的属性时才有效,只有一个对局部变量的引用:
var a = function() {
var module = {
_public: null
};
// use module._public here
return module;
}();
a._public = "foo";
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3093 次 |
| 最近记录: |