在模块模式的构造函数中调用private函数

时间:2015-05-22 09:29:38

标签: javascript

这是我第一次尝试用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)。如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

代码中的问题是声明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)可能有点棘手:构造函数被立即调用(即在定义函数_print()之前),所以你必须注意任何函数/构造函数使用的变量位于构造函数之上!

使用(A)你没有这个问题。

功能差异

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

(B)当您声明类时,构造函数代码仅被调用一次。从技术上讲,这不是构造函数,而是实际上是一些类初始化代码。

答案 1 :(得分:-1)

几个问题

  1. 为什么_init()是构造函数?构造函数应该是您要返回的构造函数。
  2. 您已将_init()函数分组(命名函数表达式)的任何特定原因?
  3. 忽略答案你想要的东西可以通过两种方式实现

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

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