Javascript 在模块模式的构造函数中调用私有函数

Javascript 在模块模式的构造函数中调用私有函数,javascript,Javascript,这是我第一次尝试用java脚本编写模块 myClass = (function() { //private members SELF = {}; //constructor (function _init() { SELF.private_member = 10; }); function _print() { return SELF.private_member; } retur

这是我第一次尝试用java脚本编写模块

myClass = (function() {
    //private members
    SELF = {};
    //constructor
    (function _init()
    {
        SELF.private_member = 10;
    });

    function _print()
    {
        return SELF.private_member;
    }

    return function() {
       _init();
       this.Print = _print;
    };

})();

var obj = new myClass();

我得到一个错误,函数_init()未定义(chrome)。如何实现这一点?

代码中的问题是
init
函数的声明方式。下面的示例将起作用

(A) 没有括号:

myClass = (
function() {
    //private members
    SELF = {};

    //constructor
    //this function is executed every time an object is created
    function _init() {
        SELF.private_member = 10;
    }

    function _print() {
        return SELF.private_member;
    }

    return function() {
       _init();
       this.Print = _print;
    };

})();
(B) 第二个选项是匿名调用_init()函数,如下所示:

myClass = (function() {
    //private members
    SELF = {};

    //constructor
    (function() {
        SELF.private_member = 10;
    })();

    function _print() {
        return SELF.private_member;
    }

    return function() {
       this.Print = _print;
    };
})();

// Better syntax for example B)
myClass = (function() {
    //private members
    SELF = {};

    function _print() {
        return SELF.private_member;
    }

    //constructor; right before the return statement
    //this code is executed ONCE only
    SELF.private_member = 10;

    return function() {
       //this code is exectuted every time an object is created
       this.Print = _print;
    };
})();
我将使用第一个示例,因为示例(B)可能有点棘手:构造函数会立即被调用(即在定义函数
\u print()
之前),因此您必须注意构造函数使用的任何函数/变量都在构造函数函数之上

(A)你没有这个问题

功能差异

(A) 每次创建新对象时都会调用构造函数_init()。 从技术上讲,这与其他面向对象编程语言中的真正构造函数非常接近

(B) 在声明类时,构造函数代码只调用一次。从技术上讲,这里不是构造函数,而是一些类初始化代码。

几个问题

  • 为什么
    \u init()
    是构造函数?构造函数应该是您要返回的构造函数
  • 您对
    \u init()
    函数进行分组(命名函数表达式)有什么特殊原因吗
  • 忽略你想要得到的答案可以通过两种方式实现

    myClass = (function() {
        //private members
        SELF = {};
        //constructor
        (function _init()
        {
            SELF.private_member = 10;
        })();
    
        function _print()
        {
            return SELF.private_member;
        }
    
        return function() {
           this.Print = _print;
        };
    
    })();
    
    var obj = new myClass();
    


    删除
    \u init
    函数定义(实际上是一个函数表达式)周围的括号。是的,它起作用了。谢谢分号重要吗?这是一个表达。它与分号一起工作您是否认识到无论您创建了多少个新的myClass实例,只有一个
    SELF
    对象?我不认为那是你想要的。@Bergi:你是对的,那不是我想要的。每个实例需要一个SELF对象?请告诉我应该怎么做?@ProgramCpp:将
    SELF
    作为所有与实例相关的私有函数的参数,并将
    传递给调用它们的任何地方。在构造函数中使用闭包。“代码中的问题是init函数的声明方式”——如果您向OP解释它发生的原因,这将非常有用。只是“去掉括号,让它工作”并不能教会你任何东西。谢谢。我更喜欢选项A,因为我需要加载所有java脚本文件,并且需要构造函数中其他文件的资源either@zerkms我认为,提供两个工作示例对大多数人来说是很有教育意义的,可以让他们理解语法应该是什么样子;-)我无法比“语法错误”更详细地解释这个问题,但如果有人添加更多细节或解释,我当然很高兴_init不是我的构造函数,它是我试图从构造函数调用的私有成员。我在代码中这样注释是因为构造函数总是调用它来构造我的对象。2.我不是故意的,我明白了。你可以阅读更多关于它和
    myClass = (function() {
        //private members
        SELF = {};
        //constructor
        function _init()
        {
            SELF.private_member = 10;
        }
    
        function _print()
        {
            return SELF.private_member;
        }
    
        return function() {
           _init();
           this.Print = _print;
        };
    
    })();
    
    var obj = new myClass();