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();