Si solo quieres algo como las características de PHP, lee la siguiente solución que se me ocurrió. Supongo que pondrás esta funcionalidad en tus propios objetos. Bueno, mientras no sean funciones, puede tener la siguiente convención por conveniencia, y debería funcionar en todos los navegadores:
en lugar de myobj.foo o myobj ['foo'], simplemente use myobj (' foo '), y hacer que tu objeto se llame cuando lo defines. Pero deberá evitar el uso de "nuevo" porque "nuevo" nunca puede devolver una función en Javascript.
var NewFlexible = function() {
var custom = {};
return function(prop) {
if (!(prop in custom)) custom.prop = null;
return custom.prop;
};
};
Y a continuación, puede crear objetos de esta manera:
myObj = NewFlexible();
el uso de algo similar al patrón de Douglas Crockford, puede crear "clases" que se extienden a lo siguiente:
var NewDerived = function(options) {
var result = {};
NewFlexible.apply(result, arguments); // parent constructor
// go on to do what you have to do
return result;
};
O , para olvidarse de los constructores, puede hacer un contenedor alrededor de los objetos:
var MakeFlexible = function (obj) {
return function(prop) {
if ('prop' in obj) return obj.prop;
obj.prop = null; return obj.prop;
};
}
Simplemente tendrá que publicar esta documentación para todos los usuarios de su código. En realidad, es bueno exponer tu funcionalidad a través de esta convención porque no quieres asustar a la gente mediante el uso de JavaScript no estándar.
esto no es estándar ... – jldupont
ni siquiera en V8: http://code.google.com/p/v8/issues/detail?id=264 – jldupont
OP nunca lo mencionó como un requisito; por lo que sé, podría estar usando Rhino. solo diciendo, esta es una forma de hacerlo. –