Javascript (显示)模块模式、公共变量和返回语句
我试图了解(揭示)模块模式中的公共属性是如何工作的。他指出的一个优点是: 显式定义的公共方法和变量,可提高可读性 让我们看一下这段代码(): 调用Javascript (显示)模块模式、公共变量和返回语句,javascript,module-pattern,revealing-module-pattern,Javascript,Module Pattern,Revealing Module Pattern,我试图了解(揭示)模块模式中的公共属性是如何工作的。他指出的一个优点是: 显式定义的公共方法和变量,可提高可读性 让我们看一下这段代码(): 调用a.\u public时返回null。我现在可以操纵这个公共属性,比如a.\u public='public'。但我不能从我的对象中改变它。或者至少这些变化没有通过。我有点希望它是“public”,因为它以前是由init-方法更新的 这是否意味着,我不能有任何方法来处理公共属性?那么这种模式下的公共属性就没有什么意义了,对吧?我也试过了,但运气不好()
a.\u public
时返回null
。我现在可以操纵这个公共属性,比如a.\u public='public'代码>。但我不能从我的对象中改变它。或者至少这些变化没有通过。我有点希望它是“public”
,因为它以前是由init
-方法更新的
这是否意味着,我不能有任何方法来处理公共属性?那么这种模式下的公共属性就没有什么意义了,对吧?我也试过了,但运气不好():
最后,但并非最不重要的是,我有一个关于整个
return
语句的问题。为什么不能使用返回这个代码>公开一切?因为这个
应该是自调用函数的上下文,它不应该只返回其中的所有内容吗?为什么我必须创建另一个返回的对象?在这种情况下,它返回窗口
对象
这是否意味着,我不能有任何方法来处理公共属性
不,这意味着不能有公共变量var\u public
是一个变量,不能从外部访问,修改私有变量时,它不会反映在public\u 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,
}
}();
我可以操纵那个公共属性,比如._public='public';。但我不能从我的对象中改变它
您可以在对象的方法中使用此
,如上所示。或者使用a
引用对象,甚至可能存储对返回对象的本地引用。请参阅以了解差异
或者至少这些变化没有通过
是的,因为变量不同于属性(与Java等其他语言不同,全局语言也有例外)。在对象文本中导出public:_public
时,它仅从_public
变量中获取当前值,并使用该值在对象上创建属性。没有对变量的持久引用,对其中一个变量的更改不会反映在另一个变量中
为什么不能使用返回这个代码>公开一切?因为这应该是自调用函数的上下文,所以它不应该只返回其中的所有内容吗
变量是JavaScript中作用域的一部分。(除了全局作用域)这些作用域不是语言可访问的对象
不是指函数的这个范围,而是指调用提供的上下文。它可以是方法调用中的基本引用、构造函数调用中的新实例,或者与您的基本函数调用(或松散模式下的全局窗口对象)中的任何内容都不同。在模块定义中,\u public
是按值复制的,因为在javascript中,只有对象是按引用分配的。之后,它与本地公共变量没有任何联系。因此,只有当您在对象中“装箱”了_public,从而通过引用复制它,或者您在模块中也引用了对象的属性,并且只有一个对局部变量的引用时,这才有效:
var a = function() {
var module = {
_public: null
};
// use module._public here
return module;
}();
a._public = "foo";
可以使用此构造创建新类
function a(){
var _private = null;
this.public = null;
this.getPrivate = function(){
return _private;
};
function init(){
_private = "private";
this.public = "public";
}
init.apply(this, arguments);
}
//static function
a.create = function(){
return new a();
};
//using
var b = new a();
//or
var b = a.create();
非常感谢您的简短而有益的解释。@T.J.Crowder:谢谢您的信心:-)实际上,我在发布此存根后就去吃午饭了,看到您已经回答了…不幸的是,您删除了您的答案,其内容甚至没有保留在历史中:-/是的,我也看到了他的答案,也有一些很好的见解。但它突然消失了。似乎是一个很酷的把戏,把东西装进东西里。谢谢
var a = function() {
var module = {
_public: null
};
// use module._public here
return module;
}();
a._public = "foo";
function a(){
var _private = null;
this.public = null;
this.getPrivate = function(){
return _private;
};
function init(){
_private = "private";
this.public = "public";
}
init.apply(this, arguments);
}
//static function
a.create = function(){
return new a();
};
//using
var b = new a();
//or
var b = a.create();