Acceder a una constante dentro de un objeto en javascript

Estoy creando un método de eventos personalizado, para hacerlo debo crear los tipos de evento como constantes. Mi duda es cómo acceder a una constante dentro de un objeto.

Ejemplo:

var EventManager=function() {
    const EVENT_ON_USER_LOGIN = "EVENT_ON_USER_LOGIN";
};

desde afuera quiero acceder a EVENT_ON_USER_LOGIN. Algo así:

var eventManager = new EventManager();
console.log(eventManager.EVENT_ON_USER_LOGIN );

tampoco puedo acceder asi

console.log(EventManager.EVENT_ON_USER_LOGIN );
7
задан 18.12.2016, 22:10
5 ответов

Ты можешь делать это:

var EventManager = function(){
  //codigo
}

EventManager.EVENT_ON_USER_LOGIN = 'EVENT_ON_USER_LOGIN';

//y lo podrías usar así:
var eManager = new EventManager();
EventManager.EVENT_ON_USER_LOGIN;

Ответ @josego ты podrГ, - чтобы функционировать tambiГ©n.

//De esta manera los objetos que se definan tendrán la propiedad 'EVENTS' con los tipos de eventos y serán inmutables 
var EventManager = function(){
    var events = {
        EVENT_ON_USER_LOGIN: 'EVENT_ON_USER_LOGIN'
    };
    this.EVENTS = Object.freeze( events );
};
//
var eventManaget = new EventManager();
eventManager.EVENTS.EVENT_ON_USER_LOGIN;  //'EVENT_ON_USER_LOGIN'

Или podrГ-схвати возвращать объект, 'замороженный' с Object.freeze

var EventManager = function(){
    var eventManager = function(){
        this.EVENT_ON_USER_LOGIN = 'EVENT_ON_USER_LOGIN';
    };
    return Object.freeze( new eventManager() );
};
var eventManager = new EventManager();
eventManager.EVENT_ON_USER_LOGIN; //   'EVENT_ON_USER_LOGIN'
3
ответ дан 24.11.2019, 12:02
  • 1
    Эта solució n определи свойство comú n и течение, и не одну установите (одинокий чтение). – Marcos 19.12.2016, 16:44
  • 2
    @Mariano очень верное то, что говорит Маркос Галлардо. Он не решает тему постоянной величины. Это переменная EventManager. EVENT_ON_USER_LOGIN = ' EVENT_ON_USER_LOGIN'; – josego 19.12.2016, 16:52
  • 3
    ☝☝☝ @ftorres он автор, я só corregí деталь ответа – Mariano 19.12.2016, 16:55

Насколько я знаю не возможно заставлять заявлять прямо внутри нее funciГіn постоянная величина и использовать вне ее funciГіn. Которое, если ты обрезал делать что-то, как что я показываю внизу. Object.freeze (miConstante) он оставляет себе как постоянная величина, и если он queres распределять новую стоимость, это не берет.

class miConstante {};
miConstante.EVENT_ON_USER_LOGIN = "EVENT_ON_USER_LOGIN";
Object.freeze(miConstante);

console.log("Valor de la constante: ", miConstante.EVENT_ON_USER_LOGIN );

// NO cambia el valor de la constante.
miConstante.EVENT_ON_USER_LOGIN = "Hola";
console.log("CAmbiar valor de la constante: ", miConstante.EVENT_ON_USER_LOGIN );

Надеялся, что он подает тебя.

1
ответ дан 24.11.2019, 12:02
  • 1
    если он подает меня, я могу использовать это так, в любом случае - из-за команды код мой и буду использовать это я сам, но он хотел сделать это самым аккуратным, большое спасибо! – Pablo 18.12.2016, 22:45
  • 2
    @Pablo Из-за темы порядка, podrí схвати определять способ программировать и использовать está ndares, как который все постоянные величины esté n в mayú sculas и definí всегда в начале твоего рукописного шрифта. Если он подает тебе ответ podrí схвати помещать это как решенный. Спасибо – josego 18.12.2016, 22:48
  • 3
    @Pablo, если тебе удалось решить, podrí схвати помещать ответ, что ты sirvió. Большое спасибо – josego 19.12.2016, 16:52

Ты можешь использовать методы privileged следующего способа:

Лиши тебя

function Constructor(value) {
   var that = this;
   var membername = value;
   var membername = function membername() {...};
}

Privileged

function Constructor(value) {
   var that = this;
   const memberName = value;
   this.methodMemberName = function () { return memberName; };
}

Так следующей формы для твоего примера:

var EventManager = function(){
	const EVENT_ON_USER_LOGIN  = "EVENT_ON_USER_LOGIN";
    this.getEventOnUserLogin = function(){
       return EVENT_ON_USER_LOGIN;
    }
    this.EVENT_ON_USER_LOGIN = function(){
       return EVENT_ON_USER_LOGIN;
    } 
}

var eventManager = new EventManager();

console.log(eventManager.EVENT_ON_USER_LOGIN());
console.log(eventManager.getEventOnUserLogin());

В моем случае я предпочитаю, чтобы событие назвалось getEventOnUserLogin.

Ты можешь находить больше информации в следующей ссылке http://www.crockford.com/javascript/private.html

1
ответ дан 24.11.2019, 12:02

Выбор, который у тебя есть, состоит в том, чтобы замораживать объект, как предложи josego используя Object.freeze(variable). В этой ссылке он объясняет себе, что:

Метод Object.freeze() заморозь объект: а именно, он предотвращает, что новые свойства были совокупными; privene, что существующие свойства были удалены; и он предотвращает, что существующие свойства, или Ваша способность перечисления, конфигурации, или написание. того, чтобы быть изменениями курса. В escencia объект сделан действительно неизменным. Метод возвращает замороженный объект.

То, что ты мог бы делать, состоит в том, чтобы определять твой объект с постоянными величинами, в котором ты нуждаешься, и тогда замораживать это. Плохое этого состоит в том, что заморозятся ВСЕ переменные, не только те, которые ты хочешь, что они были постоянными. Функции продолжили бы функционировать обычно, тогда то, что ты мог бы делать, состоит в том, чтобы определять все в объекте и добавлять его "строитель", который бы это замораживал и это возвращал (для того, чтобы было возможно стандартизировать и использовать так же с более чем одной переменной).

Здесь я оставляю пример:

var miObjeto = {
  // aquí irían las constantes
  EVENT_ON_USER_LOGIN: "EVENT_ON_USER_LOGIN",
 
  // aquí puedes poner funciones

  // el "constructor" que congelará y devolverá el objeto 
  constructor: function() {
    Object.freeze(this);
    return this;
  }
}

var em = miObjeto.constructor();
console.log(em.EVENT_ON_USER_LOGIN);

em.EVENT_ON_USER_LOGIN = "Un texto diferente";
console.log(em.EVENT_ON_USER_LOGIN);

Или если ты хочешь оставить это в форме функции, как это у тебя было сначала, ты мог бы делать что-то похожим на это:

function EventManager() {

    const obj = {
      EVENT_ON_USER_LOGIN: "EVENT_ON_USER_LOGIN"
    };
    
    return Object.freeze(obj);
  
}

var em = new EventManager();
console.log(em.EVENT_ON_USER_LOGIN);

em.EVENT_ON_USER_LOGIN = 12;
console.log(em.EVENT_ON_USER_LOGIN);
1
ответ дан 24.11.2019, 12:02

PodrГ-схвати делать следующее:

  • Object.defineProperty (IE9+): Восток mГ©todo позволяет aГ±adir или изменять свойство в объекте. Показывая writable: false, свойство создаст одинокого чтение.

var EventManager = function(){
  //codigo
}

Object.defineProperty(EventManager, 'EVENT_ON_USER_LOGIN', {
  enumerable: false,
  configurable: false,
  writable: false,
  value: 1
});

console.log(EventManager.EVENT_ON_USER_LOGIN);
EventManager.EVENT_ON_USER_LOGIN = 2;
console.log(EventManager.EVENT_ON_USER_LOGIN);
  • ES6 : могут создавать переменные одинокого чтение ( постоянных величин ) используя ключевое слово const.

    const EVENT_ON_USER_LOGIN = 1;
    

    К сожалению mГ©todo не возможно использовать этот, чтобы заявлять наличные как свойство объекта.

    Способ получать результат, сходный с предложенным в вопросе, - используя синтаксисов get, сочетаемую с static.

class EventManager {

  static get EVENT_ON_USER_LOGIN() { return 1; }
}

console.log(EventManager.EVENT_ON_USER_LOGIN);
try {
 EventManager.EVENT_ON_USER_LOGIN = 2;
} catch(e) {
  console.log('ERROR!');
}
console.log(EventManager.EVENT_ON_USER_LOGIN);
1
ответ дан 24.11.2019, 12:02