Ограничение доступа к переменным JavaScript

Я модифицирую модуль для игры, которую мы разрабатываем, и он построен на игровом движке ImpactJS. Мы хотели сделать переменные частными или недоступными для других классов.

Например:

this.object.variable = 100; // Not okay.
this.object.setVariable( 100 ); // Okay.

ig.module( 
    'game.data.server' 
).requires(

).defines(function(){

    ServerData = ig.class.Extend({
        _variable : -1,

        get variable() {
            return this._variable ;
        },
        setVariable: function( value ) {
            this._variable = value;
        }
    });
});

Но установщик JavaScript и получатель возвращают разные результаты

Мы не можем сделать несколько ревизий, потому что это также доступно для других игр, которые мы разрабатываем.

Есть ли лучшее решение?

1 ответ

Решение

Первая возможность

Вы можете попробовать сделать это, но так как я ничего не разработал с использованием ImpactJS, это может работать не так, как ожидалось, поскольку это зависит от того, что .class.extend() Функция выполняет внутренне.

Но стоит попробовать.

var ServerData = ig.class.Extend((function() {
    var privateVar = -1;
    return {
        getVariable: function() {
            return privateVar;
        },
        setVariable: function(value) {
            privateVar = value;
        }
    };
})());

Этот код может показаться вам немного запутанным, но то, что я изменил, я создал немедленно выполняющуюся функцию для создания замыкания функции, которая требуется для создания приватного пространства, в котором я создал приватную переменную замыкания, которая не видна снаружи.

Я бы посоветовал вам прочитать Javascript Дугласа Крокфорда и узнать еще больше о языке, который вы используете.

Вторая возможность

По ссылке в комментариях кажется, что мы можем использовать defineЗакрытие для частных членов:

var privateVar = -1;

var ServerData = ig.class.Extend({
    getVariable: function() {
        return privateVar;
    },
    setVariable: function(value) {
        privateVar = value;
    }
});
Другие вопросы по тегам