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 );
Ты можешь делать это:
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'
Насколько я знаю не возможно заставлять заявлять прямо внутри нее 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 );
Надеялся, что он подает тебя.
Ты можешь использовать методы 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
Выбор, который у тебя есть, состоит в том, чтобы замораживать объект, как предложи 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);
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);