这是我第一次尝试用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)。如何实现这一目标?
答案 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)
几个问题
_init()
是构造函数?构造函数应该是您要返回的构造函数。_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();
和
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();