在 JavaScript 创建私有函数和变量

发布于 2019-05-24 20:06:13 字数 2959 浏览 1305 评论 0

很多人都非常反感 JavaScript 编程,由于某些原因,他们不能容忍缺乏安全和结构的编程语言,其中的一个缺点是结构内的变量的名称缺乏私有,他们坚信有一点,如果你创建一个属性对象,或者创建三维的全局变量,这是任何人都公平的游戏。然而一些非常简单的模式,你可以使用 JavaScript 来保护在访问一个给定的对象或变量的私有。

Classes

你可能知道在 JavaScript 中是不存在真实的类的,但使用功能和原型,我们可以模拟非常好。使用这种模式,你也可以模拟私有变量:

function MyClass(parameter) {
    // Create the private var
    var privateVar = 8,
        self = this;
    self.parameter = parameter
    // Function that handles the private
    function handlePrivate() {
        return privateVar ? privateVar-- :  false;
    }
    // Public method that calls the handler
    // Returns parameter until it's been accessed 8 times
    this.getPrivate() {
        return handlePrivate() ? self.parameter : null;
    }
}

私有的创建通过构建函数,而且也只能通过构建函数创建,添加了特别的访问方法来访问私有属性,在以上示例中,值只有通过特定的方法访问。

Closures

模式围绕一个变量范围关闭,返回一个对象或函数来访问变量。这是一个简单的例子:

var accessor = (function() {
    // Create the private var
    var privateVar = "You Can't See Me, ";
    
    // Some other functionality here that periodically changes privateVar, because it has access to it
    // [ more code here ]
    
    // Return the accessor
    return function(name) {
        return privateVar + name;
    };
})();

// Use!
// currentValue = accessor("David");  "You Can't See Me, David"

privatevar 变量不可用外关闭,所以没有办法直接访问的。我们这样做,然而,能够变回从闭合有一个定义函数。因此,变量保持私密,你可以访问它的值,但不允许直接访问。你也可以返回修改受保护对象变量的方法:

var accessor = (function() {
    
    // The "private"
    var val = 9;
    
    // An object for getting and setting
    return {
        get: function() {
            return val * 3;
        },
        set: function(s) {
            val = s;
        }
    };
})();

当然以上的模式,用户可以重新获得类似的方法:

accessor = function(n) { return "My custom string, " + n; }

通常所有的功能处理私人信息处于封闭,防止用户重写方法的问题。像这样的东西:

var accessor = (function() {
    
    var permissions = {};
    
    function handleResult(perm) {
        // Do something with the result
    }
    
    return function(permissionToCheck, callback) {
        if(permissions[permissionToCheck]) != undefined) {
            callback(permissions[permissionToCheck]);
        }
        else {
            $.post({
                url: "/permissions"
                data: {
                    perm: permissionToCheck
                }
            }).success(function(res) {
                callback(handleResult(res));
            });
        }
    };
    
})();

在 JavaScript 简单一定美,不把它写下来,因为它不提供相同的显式结构为其他语言。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84935 人气
更多

推荐作者

遥远的她

文章 0 评论 0

情深如许

文章 0 评论 0

18120987591

文章 0 评论 0

女皇必胜

文章 0 评论 0

13002228876

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击“接受”或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。