javascript - 模块模式 & "private attributes"

标签 javascript private-members module-pattern

好吧,几周前,我了解了 javascript 中的“模块模式”。我发现的所有例子基本上都是这样的:

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

但是没想到,所谓的“私有(private)”属性“id”,并不是一个实例变量。如果我注意的话,我就会注意到这样一个变量的范围...我严重误解了“私有(private)变量和函数”注释...

尽管如此,我决心找到一种在模块中使用私有(private)实例变量的方法。

目前我找到的唯一解决方案是这种很好的旧方法:

myModule.User = (function(){
    "use strict";

    //constructor
    var User = function(id){        
        this.getId = function(){ return id; };
    };   

    return User;
})();

但是原型(prototype)优势已经没有了......

你有更好的方法来混合“模块模式”和私有(private)实例变量的使用吗?

最佳答案

坦白说,我从未将模块模式与构造函数一起使用,我觉得有更好的方法,但是要实现您正在寻找的东西(也就是说,如果我理解正确的话),您可以执行以下操作:

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

这是一个fiddle

另外,我应该澄清一下,在您的情况下,id 设置为静态变量,并且在模块之间共享。 希望对您有所帮助。

关于javascript - 模块模式 & "private attributes",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16463746/

相关文章:

javascript - 使用ajax和php强制下载文件

javascript - 优化 javascript/coffeescript 中的视差滚动

swift - 需要在设置属性 P 后调用方法 M

javascript - 继承和模块模式

closures - Javascript 模块使用 Apply 并返回 this

javascript - Angular $watch 不起作用,除非我点击屏幕上的一些

javascript - 如何正确清理timbre.js

oop - 有没有办法为具有私有(private)成员的 VBA 类编写相等性测试,而不暴露这些私有(private)成员存在的知识?

java - 使 Java 对象的属性只能由该对象访问

Javascript 模块模式事件和监听器