Javascript 只设置一次模块属性

Javascript 只设置一次模块属性,javascript,oop,design-patterns,module,Javascript,Oop,Design Patterns,Module,我有一个模块,如下所示: var Module = (function() { var id; var setID = function(a){ if(a) id = a; else id = undefined; }; var getID = function(){ return id; }; // Return the object that is assigned to Module return { setID: setID,

我有一个
模块
,如下所示:

var Module = (function() {

var id;

var setID = function(a){
    if(a)
     id = a;
    else 
     id = undefined;
};

var getID = function(){
    return id;
};
// Return the object that is assigned to Module
return {
    setID: setID,
    getID: getID
};
}());
在其中,我通过
setID()
函数设置
id
成员

我想知道:这样,
setID
就是我模块的一个
public
成员,我的应用程序中的每个
模块都可以调用它。我将只设置
id
一次,因此避免调用
setID()
来设置只能设置一次的is值。有办法吗


我不熟悉
模块
设计模式,因此请原谅我的任何不恰当之处。

如果ID已设置,您可以修改
设置ID
,使其不做任何操作:

var setID = function(a){
    if(typeof a != 'undefined' && typeof id == 'undefined')
       id = a;
};

然后其他模块仍然可以调用它,但它不会执行任何操作(或者您可以让它抛出一个错误或返回
false

如果ID已经设置,您可以修改
setID
,使其不执行任何操作:

var setID = function(a){
    if(typeof a != 'undefined' && typeof id == 'undefined')
       id = a;
};

然后其他模块仍然可以调用它,但它不会做任何事情(或者您可以让它抛出错误或返回
false

在setID函数中删除this.setID。或者,如果您不需要IE8,可以使用Object.defineProperty()在定义模块时传递id是否可以,或者是否需要稍后进行设置?我必须稍后进行设置,因为我必须调用module.setID(idvalue)在setID函数中删除此.setID。或者,如果不需要IE8,可以使用Object.defineProperty()在定义模块时传递id是否可以,或者是否需要稍后进行设置?我必须稍后进行设置,因为我必须调用module.setID(idvalue),我几分钟前才想出这个解决方案。。但是我没有检查
typeof
,而是使用了:
if(a&&!id)
。主要区别是什么?区别在于,如果您尝试将ID设置为假值(如
false
null
0
),则您的版本将不会执行任何操作。我假设您希望允许这些值,所以我将代码更改为仅拒绝
未定义的
。不,实际上我可以只接受我最初设置的值,不允许其他值。另一个问题,为什么不使用===?我说的是您最初设置的值。如果您第一次调用
setID(0)
,它将不会设置id(因为
!a
为true
)。也许这就是目的。为了回答另一个问题,我可以在这里安全地使用
=
,因为我知道
typeof
总是返回字符串。这样做可能会稍微慢一点(并且不会通过jslint)。你可能知道这种选择可能会导致无休止的争论……你的条件(
!a&&!id
)就是这样,随他们去。我的版本允许
0
false
null
@steoI几分钟前就想出了这个解决方案。。但是我没有检查
typeof
,而是使用了:
if(a&&!id)
。主要区别是什么?区别在于,如果您尝试将ID设置为假值(如
false
null
0
),则您的版本将不会执行任何操作。我假设您希望允许这些值,所以我将代码更改为仅拒绝
未定义的
。不,实际上我可以只接受我最初设置的值,不允许其他值。另一个问题,为什么不使用===?我说的是您最初设置的值。如果您第一次调用
setID(0)
,它将不会设置id(因为
!a
为true
)。也许这就是目的。为了回答另一个问题,我可以在这里安全地使用
=
,因为我知道
typeof
总是返回字符串。这样做可能会稍微慢一点(并且不会通过jslint)。你可能知道这种选择可能会导致无休止的争论……你的条件(
!a&&!id
)就是这样,随他们去。我的版本允许
0
false
null
@斯特奥