Javascript 有没有更好的方法隐藏对象中的变量

Javascript 有没有更好的方法隐藏对象中的变量,javascript,private,Javascript,Private,假设您想要一个提供一些方法的单个JavaScript对象,如下所示: var a = { c: "hello", talk: function(){ console.log(this.c); } } 但是你不希望人们能够直接访问c,你希望它是某种私有的。我已经想出了这个解决方案,但我不知道是否有更好的: var a = new function(){ var c = "hello"; this.talk = function(){

假设您想要一个提供一些方法的单个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)";
    }
}
我知道它的工作原理与此完全相同,但对我来说,从概念上讲,在使用或查看它时,将这些第一个配置属性作为私有变量更为清晰。例如,如果我记录动画并发现它有两种方法,我会比打印所有不应该访问的属性更快地了解如何使用它。这不是关于如何做某事,而是关于如何做得更清楚更好

谢谢

可以使用创建闭包来保护变量

var MyClass=(函数(){
var myPrivate=“你好”;
返回函数(){
this.talk=函数(){
console.log(myPrivate);
};
}
})();
var instance=new MyClass();

实例.talk()第一步:为什么
c
一开始就“私人”那么重要?是的,封装为您提供了“隐私”(请注意引号),但它也迫使您在编码方面向后倾斜。除非你有一个很好的理由,否则我对这个问题的建议就是永远不要担心,这是正确的。在顶层作为变量公开的任何内容都是私有的。如果使用getter和setter,这将非常有效@deceze如果你不想有人操纵某个特定的值,并且希望它是不可变的,那么你应该这么做。相关:还有@Vandervals我对这个主题不是很了解,但我相信“隐藏”变量(因为没有更好的术语)的主要论点是保持算法的一致性,同时,您将公开一些参数,以便能够配置算法。您希望您提供给其他开发人员(甚至是“未来的您自己”)的模块或代码具有足够的灵活性,以满足他们的需求,但又足够严格,不会以您不希望记录的方式偏离其声明的目的,而开发人员“配置”它可能不会expect@deceze完全地但还是为了理智。如果私有变量的作用域在闭包内,那么它也确实存在。它只能访问那个特定的范围,超出这个范围的任何东西都不能访问它,用户也不能访问它。有这样做的用例。最大的问题之一是不污染名称空间。我知道如何分类,我只想要一个对象。实际上javascript是基于原型的继承,这意味着您是从另一个对象继承的。无论如何,您可以在IIFE中简单地返回一个js对象,而不是返回一个构造函数