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