2012-07-16 20 views
5
var tr={}; 
tr.SomeThing='SomeThingElse'; 
console.log(tr.SomeThing); // SomeThingElse 
console.log(tr.Other); // undefined 

tr.get=function(what){ 
    if (tr.hasOwnProperty(what)) return tr[what]; 
    else return what; 
}; 
tr.get('SomeThing') // SomeThingElse 
tr.get('Other') // Other 

¿Hay alguna manera de hacer que tr.Other or tr ['Other'] y todas las demás propiedades indefinidas del objeto devuelvan su nombre en lugar de indefinido?Establezca la propiedad javascript indefinida antes de leer

+0

No. ¿Por qué querrías hacer eso? ¿Qué pasa con tu función get()? – Bergi

+0

'tr' es un objeto que contiene traducción de sitios. A veces no tiene los campos obligatorios – rndm

+0

OK, aunque creo que una alternativa al inglés (o bien) sería mejor que el nombre del mensaje :-) Responda mi segunda pregunta: ¿Qué ocurre con la función get()? – Bergi

Respuesta

2

Puede define a getter para su propiedad.

+0

Está en desuso y no es estándar, y no resuelve mi problema – rndm

+1

Solo 'Object.prototype .__ defineGetter __()' está en desuso. 'Object.defineProperty()' y '{get propName() {}}' son estándar y no están en desuso. Como lo ha indicado, su pregunta puede ser resuelta con getters. Usted ha pedido que una propiedad específica ('Otro') devuelva su nombre si no está definido, ¿está pidiendo en su lugar que cualquier propiedad del objeto devuelva su nombre? Si es así, actualiza tu pregunta. – lanzz

+0

Sí, necesito que cualquier propiedad del objeto devuelva su nombre – rndm

4

tres soluciones:

  • poner en práctica su objeto como un Proxy, que está diseñado para hacer exactamente lo que quiere. Sin embargo, es solo un borrador y actualmente solo supported in Firefox' Javascript 1.8.5 Se estandarizó con ES6, pero podría no estar disponible en todos los entornos.

  • Llene siempre su objeto de traducción con un juego completo de mensajes. Al crear ese "diccionario" (en el lado del servidor o en el lado del cliente), siempre incluya todas las claves necesarias. Si no existe traducción, puede usar un idioma alternativo, el nombre del mensaje o la representación de cadena de undefined, a su elección.

    Pero una propiedad no existente siempre debe significar "no hay tal mensaje" en lugar de "no hay traducción disponible".

  • Use una función getter con un parámetro de cadena en lugar de las propiedades del objeto. Esa función puede mirar los mensajes hacia arriba en un objeto de diccionario interno, y manejar errores falla programáticamente.

    Yo recomendaría un objeto de mapa que es diferente del diccionario, para permitir que "obtener" y co como nombres de mensajes:

var translate = (function(){ 
    var dict = { 
     something: "somethingelse", 
     ... 
    }; 
    return { 
     exists: function(name) { return name in dict; }, 
     get: function(name) { return this.exists(name) ? dict[name] : "undefined"; }, 
     set: function(name, msg) { dict[name] = msg; } 
    }; 
})(); 
1

Si bien esta solución no es exactamente lo que estaba buscando, una implementación de JavaScript de la clase collections.defaultdict de python podría ayudar:

var collections = require('pycollections'); 
var dd = new collections.DefaultDict([].constructor); 
console.log(dd.get('missing')); // [] 
dd.get(123).push('yay!'); 
console.log(dd.items()); // [['missing', []], [123, ['yay!']]] 
Cuestiones relacionadas