Есть ли лучший способ скрыть переменные в объекте

Возьмите, что вы хотите один объект 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)";
    }
}

Я знаю, что это работает идеально, как это, но для меня, концептуально, гораздо яснее при использовании или просмотре его, чтобы иметь эти первые свойства конфигурации в качестве частных переменных. Например, если я регистрирую анимацию и обнаруживаю, что она имеет 2 метода, я быстрее понимаю, как ее использовать, чем если все те свойства, которые не должны быть доступны, также печатаются. Это не о том, как сделать что-то, это о том, как сделать это яснее и лучше.

Спасибо!

1 ответ

  1. Вы можете использовать IIFE, чтобы сделать закрытие для защиты вашей переменной

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