【问题标题】:Is there a better way to hide variables in an object有没有更好的方法来隐藏对象中的变量
【发布时间】:2017-06-01 13:35:21
【问题描述】:

假设您想要一个提供一些方法的单个 JavaScript 对象,如下所示:

var a = {
    c: "hello",
    talk: function(){
        console.log(this.c);
    }
}

但是您不希望人们能够直接访问 c,您希望它是私有的。我已经想出了这个解决方案,但我不知道是否有更好的解决方案:

var a = new function(){
    var c = "hello";
    this.talk = function(){
        console.log(c);
    };
}

你能想出更好的解决方案吗?你能说出为什么它更好吗?

您能否指出这种方法可能给我带来的任何问题(性能、可维护性或其他)?

我在这里留下一个额外的例子,我认为这在概念上可能有用:

var Animation = {
    from_right: "translate(100%,0)",
    from_bottom: "translate(0,100%)",
    zoom: "translate(0,0) scale(0)",
    default: "translate(100%,0)",
    get_initial: function(type){
        switch (type) {
            case "from_right":
            case "from_bottom":
            case "zoom":
                return this[type];
                break;
            default:
                return this["default"];
                break;
        }
    },
    get_final: function(){
        return "translate(0,0) scale(1)";
    }
}

我知道这完全像这样工作,但对我来说,从概念上讲,使用或查看它以将这些第一个配置属性作为私有变量时会更清楚。例如,如果我记录 Animation 并发现它有 2 个方法,我会比打印所有不应该访问的属性更快地意识到如何使用它。这不是关于如何做某事,而是关于如何将它做得更清晰更好。

谢谢!

【问题讨论】:

  • 第一步:为什么c 一开始就是“私人的”那么重要?是的,封装给了你“隐私”(注意引号),但它也迫使你在编码方面向后弯腰。除非您有非常好的理由,否则我对这个问题的建议始终是不要担心。
  • 这是正确的。在顶层作为变量公开的任何内容都是私有的。如果使用 getter 和 setter,这非常有用。 @deceze 如果您没有人操纵该特定值并希望它不可变,您会想要这样做。
  • @Vandervals 我对这个主题不是很了解,但我相信“隐藏”变量的主要论点(因为没有更好的术语)是保持算法的连贯性,而你会公开一些参数以启用配置算法。您希望您提供给其他开发人员(甚至“未来自己”)的模块或代码片段足够灵活以适应他们的需求,但又足够严格,不会以您不会的方式偏离其既定目的想要记录,而开发人员“配置”它可能没想到
  • @deceze 完全是为了理智。如果私有变量的范围在闭包内,那么它也确实存在。它只能在该特定范围内访问,除此之外没有任何东西可以访问它,用户也不能访问它。有这样做的用例。最大的问题之一是不污染命名空间。

标签: javascript private


【解决方案1】:

您可以使用IIFE 进行闭包以保护您的变量

var MyClass = (function(){
    var myPrivate = "hello";
    return function(){
        this.talk = function(){
            console.log(myPrivate);
        };
    }
})();

var instance = new MyClass();
instance.talk();

【讨论】:

  • 我知道怎么做,我只想要一个对象。
  • 实际上 javascript 是基于原型的继承,这意味着您是从另一个对象继承的。无论如何,您可以在 IIFE 中简单地返回一个 js 对象,而不是返回一个构造器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多