Ocultar o esconder no es prohibir

Si me pongo a pensar y me traslado al pasado, siempre hable mal de Javascript. Últimamente he cambiado mi actitud pero con peros, es decir es un lenguaje que tiene que mejorar y no poco:).

Revisando WinJS, de esa forma que me gusta a mí. No haciendo el típico ejemplo “Hola Mundo”, sino adentrándome en las profundidades de “base.js” me encuentro con lo siguiente:

function initializeProperties(target, members) {
var keys = Object.keys(members);
var properties;
var i, len;
for (i = 0, len = keys.length; i < len; i++) {
var key = keys[i];
var enumerable = key.charCodeAt(0) !== /*_*/95;
var member = members[key];
if (member && typeof member === 'object') {
if (member.value !== undefined || typeof member.get === 'function' || typeof member.set === 'function') {
if (member.enumerable === undefined) {
member.enumerable = enumerable;
}
properties = properties || {};
properties[key] = member;
continue;
}
}
if (!enumerable) {
properties = properties || {};
properties[key] = { value: member, enumerable: enumerable, configurable: true, writable: true }
continue;
}
target[key] = member;
}
if (properties) {
Object.defineProperties(target, properties);
}
}
 

La verdad que tampoco me adentre mucho, puesto que esto te lo encuentras entre las líneas 15 y 46 de base.js.

Lo que más me llamo la atención fue concretamente esta línea

“var enumerable = key.charCodeAt(0)!== /*_*/ 95;

En realidad eso lo que hace es comprobar, como bien podéis ver si el primer carácter de una propiedad empieza por “_” y marcar enumerable como false.

¿Que es enumerable?

Pues sencillo uno de los parametros del objeto que pasamos en el tercer de los parametros a Object.defineProperty. Seguro que alguno se estará preguntado si esto significa que esa propiedad es privada por aquello de “_” , bueno eso no es así. Realmente lo que hace es ocultar esta propiedad a los siguientes métodos, entre otros:

1. Object.Keys(objecto);

2. for (prop in objecto)

Por contra  esa propiedad será accesible si accedemos a ella de la siguiente forma:

1. objeto._propiedad.

2. objecto[“_propiedad”]

3. “_propiedad” in objeto devuelve true;

Os paso el siguiente script por si alguien quiere conprobarlo.

var objeto = {};
Object.defineProperty(objeto, "_propiedad", { value: 10, enumerable: false, writable: true, configurable: true });
for (var propiedad in objeto) {
console.log(propiedad);
}
objeto["_propiedad"] = 20;
console.log(objeto["_propiedad"]);
console.log(objeto._propiedad);
console.log("_propiedad" in objeto);

Que hace por nosotros Visual Studio a nivel de Intellisense. Pues sencillo ocultar cualquier propiedad de un objeto javascript cuyo nombre empiece por “_”. Eso es bueno, pues para quien lo quiera quizá sí, para mí ya os digo que no, puesto que en el fondo esa propiedad es tan publica como cualquier otra.

De eso es fácil deducir  que cualquier objeto creado en WinJS con los métodos

WinJS.Namespace y WinJS.Class expone todas sus propiedades como públicas.

La pregunta a esto es sencilla ¿a quien le gusta esto?.

Como referencias os paso los siguientes link.

http://msdn.microsoft.com/es-es/library/kb6te8d3(v=vs.94).aspx

http://msdn.microsoft.com/es-es/library/hh965578(v=vs.94).aspx

http://kangax.github.com/es5-compat-table/#showold

Veis como Ocultar no es Prohibir Sonrisa.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *