Javascript 模块模式&“私有属性”
几周前,我了解了javascript中的模块模式。我发现的所有例子基本上都是这样的:Javascript 模块模式&“私有属性”,javascript,private-members,module-pattern,Javascript,Private Members,Module Pattern,几周前,我了解了javascript中的模块模式。我发现的所有例子基本上都是这样的: var module = (function () { // private variables and functions var foo = 'bar'; // constructor var module = function () { }; // public methods module.prototype = { som
var module = (function () {
// private variables and functions
var foo = 'bar';
// constructor
var module = function () {
};
// public methods
module.prototype = {
something: function () {
}
};
// return module
return module;
})();
var my_module = new module();
我非常激动,所以我立即开始了自己的测试:
var myModule = myModule || {};
myModule.User = (function(){
"use strict";
// "private" attribut
var id
//constructor
var User = function(l_id){
id = l_id;
};
//"public" method
User.prototype.getId = function(){ return id };
return User;
})();
var u2 = new myModule.User(2);
var u1 = new myModule.User(1);
console.log(u2.getId()); // print 2
console.log(u1.getId()); //print 2 oO
然而,我没有想到所谓的私有属性id不是一个实例变量。如果我注意的话,我会注意到这个变量的范围。。。我严重误解了私有变量和函数的注释
尽管如此,我还是决定找到一种在模块中使用私有实例变量的方法
目前,我找到的唯一解决办法是采用这种好的老办法:
myModule.User = (function(){
"use strict";
//constructor
var User = function(id){
this.getId = function(){ return id; };
};
return User;
})();
但现在已经没有原型avantages了
你有更好的方法来混合模块模式和使用私有实例变量吗?坦白说,我从来没有将模块模式与构造函数一起使用过,我觉得有更好的方法,但是要实现你想要的,如果我理解你的意思,你可以这样做:
var PrefixModule = (function () {
// this is going to be static ... also that's a real title !
var staticTitle = "Intergalactic Federation King Almighty and Commander of the Universe";
var PrefixModule = function () {
// this is an instance variable
this.secretPrefix = staticTitle + " ::";
};
// hidden from the world
var generateRandomNumber = function() {
return Math.floor(Math.random() * 100);
};
PrefixModule.prototype.PrefixName = function (name) {
var randomNumber = generateRandomNumber();
return this.secretPrefix + " " + name + " | " + randomNumber;
};
return PrefixModule;
})();
var m1 = new PrefixModule();
var m2 = new PrefixModule();
var m3 = new PrefixModule();
console.log(m1.PrefixName("Jon Skeet"));
console.log(m2.PrefixName("Chuck Norris"));
console.log(m3.PrefixName("vbarthel-fr"));
这是一本书
另外,我应该澄清一下,在您的例子中,id被设置为静态变量,并且在模块之间共享。
希望有帮助。谢谢!这有助于我更好地理解模块:模块作用域用于静态共享变量!如果您正在寻找答案,请随意接受: