Icebeat: Evitar el cache de los css y js:
Me he permitido comprimir su versión:
Con esto, añade la hora/fecha de modificación a la URL de petición, de forma que obliga al navegador a solicitar una versión distinta sólo si consta que se ha modificado el archivo. Nótese que el documento en sí no pasa a través del servidor de aplicaciones y que el servidor web ignora lo que hay detrás del interrogante (?) pero al formar parte de la URL, no cuadra con la versión que hay en caché.
<link href="css.css?<?=filemtime("css.css")?>" rel="stylesheet" type="text/css" >
31 marzo, 2008
Evitar el cache en los archivos estáticos
29 marzo, 2008
Ext.ux. YoutubePlayer
Aprovechando la nueva API de YouTube que permite, entre otras cosas, obtener un reproductor limpio (sin controles o chromeless), Ext.ux crea un controlador con un aspecto distinto y controlado por Javascript, haciendo uso de la framework ext.js.
Via WebAppers.
26 marzo, 2008
SaveTheDevelopers.org
SaveTheDevelopers.org es una campaña para fomentar la actualización del navegador desde IE6 a cualquier otro más moderno, que cumpla más con los estándares, y que por tanto facilite el trabajo a los desarrolladores web.
La forma de integrar el banner temporal que aparece en la parte superior si se accede a una página desde IE6 es la siguiente:
<script src="http://www.savethedevelopers.org/say.no.to.ie.6.js"></script>

IETester
25 marzo, 2008
mail-trends
mail-trends es un proyecto en Python que analiza visualmente el contenido de una cuenta de correo a partir de un servidor IMAP.
Atributo hash
Douglas Crockford's propone el uso de un atributo hash en aquellos tags que también usen src (como iframe o img) o href (como a). Dicho atributo contendría la codificación en base 32 del contenido al que apuntan y que cumpliría un doble propósito:
- servir de control de seguridad para comprobar que el contenido recibido se corresponde con el que se enlazó originalmente
- servir como índice para cachear contenido de forma que no se descargue multiples veces un mismo recurso aunque esté ubicado en localizaciones distintas
Shorty
Al igual que TinyURL.com, o FonGetSimple, Shorty es un script para montar tu propio servicio para acortar URL largas. Via Xyberneticos.
24 marzo, 2008
Otras comunidades sociales Open Source
Hace unos días posteé aquí LovdByLess como una web social preparada para ser una base sobre la que desarrollar una comunidad completa personalizada. Parece ser que hay otra muchas opciones:
... pero sobre todo, Dolphin tiene 6 años de antigüedad y una impresionante base de usuarios con toda clase de plugins, temas, soporte, etc. que permite crear clones de YouTube, MySpace, Odeo, Match o Facebook. (ver demo). Via WebAppers.Google Ajax API de lenguajes
Google Ajax API de lenguajes para la detección y traducción (WebAppers) es una API Ajax fácil de usar que cubre 13 lenguajes y 29 tipos de traducción entre dos lenguajes. Con esta API se pueden traducir y detectar los lenguajes de bloques de texto de una página web usando sólo Javascript.
21 marzo, 2008
Lovdbyless
Se trata de la primera plataforma open source de redes sociales. Creada sobre la cada vez más conocida plataforma Ruby-on-rails, lovdbyless.com permite descargar su plataforma funcional para que sirva como punto de partida a un desarrollo mayor. Incluye mensajes entre usuarios, perfiles, comentarios, galerías de fotos, búsqueda de amigos, integración con Flickr o Youtube, ...
Probar la plataforma.
JSAwesome
vanpelt's jsawesome (GitHub) es una librería basada en JSON para crear formularios interactivos.
Por ejemplo ...
...se convertiría en...
new JSAwesome(
'rad', [['cool','neat'], ['^neat',true]],
{'cool': {label:'Cool man', validation:'cool'}}
).to_html()
... o sea...
<label for="rad_cool">Cool man</label>
<input type="text" name="rad_cool" value="neat"/>
<label for="rad_neat"><input type="checkbox"
name="rad_neat" checked="checked"/> Neat</label>
Descargar.
20 marzo, 2008
Google Visualization API
Google Visualization API permite acceder a multiples fuentes de datos estructurados y que pueden ser mostrados, a partir de una larga selección de visualizaciones. Provee una plataforma que puede ser usada para crear, compartir y reutilizar visualizaciones escritas por la comunidad de desarrolladores.
- Incorpora visualizaciones directamente en tu web
- Escribe, comparte y reutiliza visualizaciones
- Crea extensiones a productos Google
- Usa muchas fuentes de datos pero una API

Más en Information Aesthetics, en ArsTechnica, en Google Code, Galería de visualizaciones, y nuevas tablas pivotantes en Google Docs (llamadas dinámicas en Excel).
Los discos se han convertido en cintas
Tom White explica como la mejora en un 20% anual de la transferencia de los discos y el incremento del 50% anual en capacidad junto con técnicas como MapReduce está haciendo replantearse a los fabricantes de bases de datos su tecnología actual. La velocidad de búsqueda (seek), operación en la que se basan actualmente, sólo mejora un 5% anualmente, suponiendo un lastre a las capacidades teóricas de los discos.
18 marzo, 2008
Auriculares marcianos
Más que genial disertación de Joel Spolsky (Joel on Software) sobre el enorme problema con el que se encuentra Microsoft a la hora de respetar los estándares con Internet Explorer. A parte de un montón de analogías que explican perfectamente lo complicado de la decisión, muestra los dos frentes: los idealistas que quieren dejar de arrastrar el lastre de los hacks y de los incumplimientos del estándar; y los realistas que saben que Microsoft probablemente nunca sacará un navegador que rompe la inmensa mayoría de las páginas existentes.
17 marzo, 2008
Respuestas automáticas en formato JSON para CakePHP
En Concept&Development explican las pocas y pequeñas modificaciones necesarias para que la plataforma CakePHP pueda dar respuestas en formato JSON cuando la petición incluya .json como extensión.
XHTML/CSS Markup Generator

XHTML/CSS Markup Generator es una herramienta que permite agilizar la creación de una nueva página XHTML obteniendo rápidamente un esqueleto organizado y fácil de modificar.
A brief introduction to Opacity and RGBA - CSS3
A brief introduction to Opacity and RGBA - CSS3 . Info
Con la nueva versión de CSS (v.3) la opacidad pasa de definirse así:
div { background-color: rgb(255,0,0); opacity: 1; }
a definirse con la nueva función rgba (red-green-blue-alpha):
div { background-color: rgba(255,0,0,1); }
Así se define junto con el color y además tiene la consecuencia de que los elementos hijos no la heredan (cosa que sí pasaba con opacity).
Traspaso a Blogger
Como habréis notado, estos últimos días he cambiado esta bitácora desde mi propio alojamiento con PHPosxom (un sistema basado en archivos de texto) por otro provisto por Blogger. Todos los posts han sido ya traspasados. Disculpad las molestias ocasionadas. A lo largo de los próximos días iré afinando el estilo de la bitácora, pero el contenido será totalmente accesible.
JavaScript Convertidor a números romanos
JavaScript Roman Numeral Converter es una curiosa función que convierte un número a su nomenclatura romana (2007=MMVII).
16 marzo, 2008
John Resig - Busca pero no reemplaces
John Resig propone una función para convertir una cadena como "foo=1&foo=2&foo=3&blah=a&blah=b" en otra que así: "foo=1,2,3&blah=a,b".
Resulta muy interesante el uso de la función
function compress(data){
var q = {}, ret = "";
data.replace(/([^=&]+)=([^&]*)/g, function(m, key, value){
q[key] = (q[key] ? q[key] + "," : "") + value;
});
for ( var key in q )
ret = (ret ? ret + "&" : "") + key + "=" + q[key];
return ret;
replace con una función que recibe las partes clave y valor y cuyo resultado se reemplazará en la cadena a buscar. También es interesante la técnica para comprobar si se debe concatenar una pieza más a una cadena separada por una coma: ret = (ret ? ret + "&" : "") + value;
Portales de vídeo temáticos con la nueva API de YouTube
Google Dirson se hace eco de la nueva API para YouTube que permite que crear portales verticales de "marca blanca" pero que sea Google el que controle la información.
Con las APIs, por ejemplo, podrás realizar búsquedas de vídeos, automatizaciones de subidas de vídeos o actualizar y eliminar los datos de éstos. Tienes una guía definiendo todos los métodos de esta API en esta página web.
Además, YouTube también nos ofrece la posibilidad de no utilizar el visor Flash que estamos acostumbrados a ver cuando utilizamos el clásico 'código HTML embebido', y usar un visor Flash 'Chromeless' (completamente sin adornos) que permitirá integrarlo con el diseño de la página. Este visor viene acompañado de una librería JavaScript que incorpora eventos del visor que nos permitirán por ejemplo detener y reproducir el vídeo con controles hechos a nuestra medida, quitar el sonido, saber su duración, etc. Ver ejemplo.
También en Programa con Google.

Las elecciones y soitu.es
Interesante explicación del equipo técnico de soitu.es sobre el widget que han realizado para dar los resultados en tiempo real de las Elecciones Generales en España. Explican de qué forma han optimizado el servicio para soportar 10 veces su tráfico habitual. El widget en cuestión es el siguiente:
Clickpass

ClickPass es un nuevo proyecto que permite autenticarse en una página web que soporte OpenID con un solo click:

Diseñando para la web móvil

Designing for the Mobile Web
Crear una gran experiencia web para usuarios de dispositivos móviles es mucho más fácil de lo que podría pensarse. En este artículo se introducen 7 pasos fundamentales que, si se siguen, te ayudarán a evitar los problemas que han causado que otros sitios móviles fracasen. Al final del artículo conocerás exactamente dónde enfocar los esfuerzos para construir un sitio con éxito.
IE8 acelera las cosas
Steve Souders advierte que IE8 descarga los archivos javascript en paralelo antes de ejecutarlos secuencialmente, otorgando un incremento de velocidad considerable sobre otros navegadores que descargan secuencialmente. Via Simon Willison
Flujos de datos separados para datos genéricos y de usuario
Gojko Adzic recomienda que a la hora de crear una aplicación web se separen en dos el flujo de datos genéricos (que puede ver cualquier usuario aunque no esté autenticado y que por tanto sean cacheables) y el flujo de datos del usuario (que requieren que el usuario se autentique y que, por seguridad, necesiten proceso por parte del servidor). El artículo ha tenido cierta repercusión. Via Gojko Adzic.
phplondon08 - El correo del `chico loco´
Durante una conferencia (phplondon08) sobre frameworks PHP que imitan Ruby on Rails, un señor levantó la voz durante el turno de preguntas acusando a todas las frameworks PHP de incumplir la características básicas de los MVC. Pronosticó que a medio o largo plazo, muchas de las aplicaciones realizadas sobre dichas frameworks entrarán en un callejón sin salida debido a que se están mezclando de forma totalmente irresponsable las tres partes (Modelo, Vistas, Controladores) que componen una MVC. Aunque está en inglés, vale la pena leer el mensaje que el señor envió a los organizadores. Via phplondon08 - Ian P. Christian\'s personal blog
Firecookie
Jan Odvárko ha creado FireCookie un plugin para soportar cookies en Firebug, la herramienta de depuración para Firefox. Firecookie permite ver, buscar, crear, eliminar y gestionar los permisos de una cookie desde una pestaña de Firebug.
Via Clientside CNET.
John Resig sobre Internet Explorer 8
John Resig ha hecho un análisis muy exhaustivo de las novedades en la versión beta para desarrolladores de Internet Explorer 8. En especial de las nuevas características de Javascript, que se echaban en falta en IE7. Y, la verdad, Microsoft no parece Microsoft, no sé si me explico... Ante todo, muy esperanzador.
Google Contacts Data API
Accediendo a tus contactos de Google. La única pega de tan esperado servicio es que han usado un protocolo propio (AuthSub) en lugar del estándar OAuth.
Microsoft ya publicó en su momento su propio API de contactos. Y ahora vuelve a mover pieza : Parece que Microsoft se pone las pilas y se está planteando hacer frente a Google. Si es así, ganaremos todos.
Internet Explorer 8 beta 1 disponible
Entre las novedades, una herramienta de depuración similar a Firebug, una API de selectores CSS (para un rápido getElementsBySelector), soporte de CSS 2.1, soporte de espacios de nombres (namespaces ) al estilo XHTML en HTML, Web Slices, suscripciones a contenidos cambiantes basados en el microformato hAtom y 6 conexiones por host (antes 2) que debería facilitar el desarrollo de Comet (conexiones persistentes con el servidor).
Visitar o descargar. Via Simon Willison
xssinterface
xssinterface es una librería Javascript que implementa el intercambio de mensajes entre frames cargados en diferentes dominios (comportamiento prohibido por seguridad en los navegadores).
Funciona aprovechando la interfície postMessage() de HTML5 si está disponible o simulándola de forma transparente en los navegadores actuales (aprovechando Google Gears si está instalado o una hack basado en cookies).
Y en el mismo iframe cargado:
function sayHello() {
var caller = new XSSInterface.Caller("www.listener.com","/xssinterface/html/cookie_setter.html","channel1");
caller.call("hello", "Hello World")
}
window.xssListener = new XSSInterface.Listener("1234567890","channel1");
window.xssListener.allowDomain("www.caller.com", "/xssinterface/html/cookie_setter.html", "/xssinterface/js/gears_listener.js");
window.xssListener.registerCallback("hello", function (msg) { $('output').value = msg} )
window.xssListener.startEventLoop()
XML con CouchDB
Damien Katz informa que gracias a la adopción de SpiderMonkey's E4X, la base de datos puede tratar de forma transparente con documentos XML sin cambiar una sola linea de código.
No hace tanto, la misma base de datos CouchDB abandonó XML a favor de JSON como formato para almacenar la información, lo que hizo que el proyecto ganase muchos adeptos. Ese cambio hacia Javascript ahora habilita de nuevo XML lo que demuestra que fue la mejor decisión posible. En cualquier caso, unas excelentes noticias para quienes quieren usar XML con todas las ventajas y novedades que supone esta innovadora base de datos.
Copio el ejemplo mostrado en el post:
by_lang: function(doc) {
var html = new XML(doc.content);
map(html.@lang, {title: html.head.title.text(), …});
}
El funcionamiento a la vista de Ward Cunningham
Jon Udell explica el funcionamiento de una herramienta desarrollada por Ward Cunningham (inventor del primer wiki).
La idea es poder visualizar (de ahí la transparencia) el proceso que realizan los datos dentro de una aplicación típica mostrando paso por paso cómo sigue la lógica de negocio en un diagrama. De esa forma se da seguridad al proceso, el usuario entiende mejor lo que está haciendo y las mejoras resultan más evidentes para quienes usan las herramientas.
Los ejemplos mostrados son:
- guión de cambios a realizar (el proceso que se va a visualizar)
- La ejecución de ese proceso en el sistema, mostrando los formularios tal y como los ve el usuario durante el proceso.
- La visualización del resultado mostrado en un diagrama clasificado horizontalmente por los diferentes actores y verticalmente por la secuencia de tiempo.
Google Gears de bolsillo: descárgate información en tu móvil y trabaja offline
Posiblemente tenga más éxito que la versión de escritorio. Es más fácil estar off-line con un dispositivo móvil que con un portátil y las nuevas posibilidades son atractivas.
Via Google Dirson.
SQLite para Symbian
GizMóvil anuncia que acaba de publicarse una versión de la sencilla base de datos para el sistema operativo de móviles Symbian, usado principalmente por Nokia (y en menor medida por SonyEricsson).
Sam Ruby: Truco PHP
Sam Ruby muestra que no es necesario indicar el símbolo ?> final de cierre de un archivo PHP ya que es opcional. Además, es preferible no cerrarlo para evitar espacios no deseados después del cierre que muchos editores de texto añaden, creando problemas posteriormente.
Microsoft da marcha atrás con IE8
Tal y como publicó ayer en el IEBlog y como comenta John Resig, Microsoft ha reconsiderado su postura y, por defecto, la versión 8 de Internet Explorer soportará los estándares por defecto, pasando el lastre de hacer páginas estándar a todos los administradores de intranets a los que intentaba defender frenando el progreso de las tecnologías web.
Sin duda, es la mejor decisión y la que menos romperá la web. Ojalá forme parte de esa nueva actitud de Microsoft que nadie se ha creido.
Comentar un bloque de código usando un sólo carácter
Hackszine.com: Single character commenting
Código comentado:
Código funcional con una sola barra:
/*
dosomething();
// */
También con comentarios de bloque:
Código comentado:
//*
dosomething();
// */
Código funcional con un sólo asterisco:
Código comentado:
/*/
min-height:100px;
/**/
/**/
min-height:100px;
/**/
Internet Explorer 8.0 beta para todos el 5 de Marzo
Más que esperada versión que pasa el test ACID2. Además el relativo breve plazo de tiempo transcurrido desde la salida de la 7.0 indica que, al menos aquí, Microsoft está haciendo los deberes... Por fin... Via aNieto2K.
¿Qué hay de nuevo en ECMAScript 4.0?
Excelente tabla resumen del experto Colin Moock sobre las características de la nueva versión de Javascript.
Como funcionan los temporizadores en Javascript
Interesante explicación de John Resig sobre temporizadores (setTimeout y setInterval).

Abrir sesión en sitios web sin introducir usuario ni contraseña
Dr Nic » Zero Sign On - 1 better or Infinitely better than Single Sign On?
Los conocidos certificados de usuario, que algunos hemos usado para firmar documentos ante la administración, pueden servir para autenticarnos en unas pocas páginas web.
Tal y como cuenta el autor, yo también tengo una cuenta en myopenid.com así que me he instalado sin problemas el certificado de usuario que ofrecen. Es el método ideal para entrar en un sitio de la forma más cómoda posible, aunque sólo debe instalarse el certificado en equipos que sólo controlemos nosotros.
Ojalá se extendiese su uso. Mientras tanto, recomiendo usar este bookmarklet, que genera una contraseña única para cada sitio web visitado a partir de una clave maestra que no hemos dado a nadie y que es lo único que habría que recordar (aunque resida dentro del bookmarklet y no sea necesario introducirla cada vez).
Parseo de JSON nativo
Mark Finkle cuenta que Firefox 3 está usando JSON internamente para almacenar datos en diferentes lugares de la aplicación (como las sesiones). Existe pues un único módulo JSON (anteriormente las rutinas de conversión estaban desperdigadas) disponible en XPCOM lo que implica que se puede hacer uso de él (dando la alternativa del método tradicional para que siga siendo multiplataforma) y obtener una mejora sustancial de este proceso.
Decodificando JSON:

YUI 2.5.0 - Nueva versión de la librería Yahoo! User Interface
YUI 2.5.0 Released. Con actualizaciones de DataTable (tabla de datos), nuevo gestor de diseño (Layout), uploader multi-fichero al estilo de Flickr, etc.
Tutorial de SMSs
Short Message Service / SMS Tutorial
Este tutorial provee información sobre el desarrollo de aplicaciones con SMS. Empieza con una introducción de las tecnologías de mensajes entre móviles como SMS, SMS concatenados y EMS. Aprenderás lo que es un SMS, qué causa que los SMS sean tan populares, qué aplicaciones se pueden desarrollar con tecnología SMS, lo que son pasarelas y centros SMS, y algunos conceptos básicos sobre mensajes SMS.
Después se discutirá en detalle las distintas formas de enviar y recibir mensajes SMS desde un ordenador, las ventajas y desventajas de cada manera, lo qué son los proveedores de servicio SMS, el hardware (como módems GSM / GPRS) y el software (como HyperTerminal) requerido para enviar y recibir mensajes desde un ordenador, y dónde encontrar algunas herramientas y librerías gratuitas de mensajería SMS.
El libro negro de la programación gráfica
El libro Graphics Programming Black Book de Michael Abrash, es un compendio de los artículos sobre programación gráfica que han ido apareciendo durante años en la legendaria revista de programación Dr. Dobb's Journal. Desde el enlace anterior se puede acceder a todos los documentos PDF que componen los capítulos. Imprescindible para quien trabaja con Flash o Processing.
Navegadores web y el consumo de memoria
Andrés Nieto ha realizado un estudio sobre el consumo de memoria en la nueva versión de Firefox y los resultados son espectaculares. Lo mejor, sin duda, es que la curva se estabiliza conforme aumenta el número de pestañas, en lugar de dispararse como hacen el resto. Parece que esto se debe a una nueva librería para la gestión de memoria llamada Jemalloc.

antrix.net recently
Esta página tiene la particularidad de ser totalmente estática y cargar el contenido mediante peticiones JSON a otros servidores desde Javascript.
moo.rd - Una extensión para MooTools
moo.rd es una librería ligera javascript (orientada a objetos) basada en el framework MooTools y creada por Riccardo Degni.
Está diseñada para dar funcionalidades potentes y útiles a los desarrolladores, como un montón de efectos, estándares personalizables, funciones nativas de utilidad, gestión de tablas, cajas virtuales y algunas más.
Además, moo.rd es modular, flexible, y completamente compatible con MooTools.
Ver los ejemplos.
Constructores en Javascript considerados ligeramente confusos
Traducido del Original en el blog code.h(oe)kje. Considerando la afirmación de Flanagan 2006, (página 111) que aparece en una pregunta de comp.lang.javascript el mes pasado:
En javascript, cada objeto tiene una propiedad constructor que se refiere a la función constructor que inicializa el objeto.Suena bien: hace que los constructores parezcan estáticos como las clases en Java. Incluso la sintaxis
new Constructor() parece igual:
function MyConstructor() {}
var myobject = new MyConstructor();
myobject.constructor == MyConstructor; // true
Pero la vida no es tan simple:
function MyConstructor() {}
MyConstructor.prototype = {};
var myobject = new MyConstructor();
myobject.constructor == MyConstructor; // false
¿Qué pasa? Algunas definiciones
Objetos y métodos
Los objetos en Javascript son simples bolsas de propiedades con nombre que pueden ser leidas y escritas. Para la mayoría de propósitos, javascript no tiene clases. [1]Las funciones en javascript son objetos de primera clase. Los métodos en javascript son sólo propiedades que son funciones.
Prototipos
El prototipo (prototype) de un objeto es una propiedad interna a la que me referire como "[[Prototype]]" (como en Ecma-262). En otras palabras,obj.prototype en general no es el [[Prototype]] de obj. El estándar no provee una forma de recuperar la propiedad [[Prototype]] de un objeto.Los objetos javascript pueden delegar propiedades a su [[Prototype]] (y su [[Prototype]] puede hacer lo mismo; y así hasta Object Prototype).
Búsqueda de propiedades
Cuando una propiedad "propname" de un objeto es leida, el sistema comprueba si ese objeto tiene una propiedad llamada "propname". Si esa propiedad no existe, el sistema comprueba el [[Prototype]] del objeto para encontrar la propiedad, y así recursivamente.Esto significa que los objetos que comparten un mismo [[Prototype]] tambien comparten las propiedades definidas en ese [[Prototype]].
Cuando una propiedad "propname" de un objeto se establece, la propiedad se inserta en ese objeto, ignorando la cadena [[Prototype]] de ese objeto (y ocultando cualquier propiedad del mismo nombre en la cadena de prototipos).
La propiedad [[Prototype]] se inicializa desde la propiedad (pública) "prototype" de la función constructor, cuando ésta es llamada.
¿Qué está pasando? Línea por línea.
Esto es lo que las propiedades prototype y [[Prototype]] parecen. Las elipses son objetos, las flechas son propiedades que referencia a otros objetos. La/s cadena/s [[Prototype]] están en verde.#1: function MyConstructor() {}
Bastante simple.
MyConstructor.prototype es una propiedad que es automáticamente creada, la cual en cambio tiene una propiedad constructor que apunta a MyConstructor. Recuerda eso: los únicos objetos que de hecho tienen una propiedad constructor por defecto son las propiedades de funciones prototype que se crean automáticamente.El resto no es realmente relevante pero podría confundir e iluminar (con suerte en ese orden):
El [[Prototype]] de
MyConstructor es Function.prototype, no MyConstructor.prototype. Nótese también que la cadena [[Prototype]] de cada objeto termina en el Object.prototype.El [[Prototype]] de
Object.prototype es realmente null indicando que es el final de la cadena.
Para los siguientes pasos, estoy dejando la cadena [[Prototype]] de MyConstructor por claridad, ya que no cambia y no es relevante.
#2: MyConstructor.prototype = {}
Ahora hemos terminado con el objeto
MyConstructor.prototype predefinido y lo hemos sustituido con un objeto anónimo, mostrado aquí como "{}". Este objeto no tiene propiedad constructor,
#3: var myobject = new MyConstructor()
De este grafo, siguiendo las reglas de búsqueda de propiedades, podemos ahora ver que myobject.constructor es delegado a Object.prototype.constructor, el cual apunta a Object. En otras palabras:
function MyConstructor() {}
MyConstructor.prototype = {};
var myobject = new MyConstructor();
myobject.constructor == Object
¿Y qué pasa con instanceof?
Javascript facilita el operador instanceof que pretende comprobar la cadena de prototipos del objeto con el que estás tratando. A partir de lo de antes, podrías pensar que lo siguiente devolvería false:
function MyConstructor() {}
MyConstructor.prototype = {};
var myobject = new MyConstructor();
myobject instanceof MyConstructor // true
Pero el hecho es que funciona (pulsa el botón). También nota que myobject delega en Object.prototype:
function MyConstructor() {}
MyConstructor.prototype = {};
var myobject = new MyConstructor();
myobject instanceof Object
Cuando se llama a
instanceof, comprueba la propiedad prototype del constructor dado y comprueba la cadena [[Prototype]] del objeto dado. En otras palabras, no depende de la propiedad constructor.Todo muy bonito, pero tu puedes aún romperlo si lo intentas con ganas:
function MyConstructor() {}
var myobject = new MyConstructor();
MyConstructor.prototype = {};
[ myobject instanceof MyConstructor, // false !
myobject.constructor == MyConstructor, // true !
myobject instanceof Object ] // true
Así quedan las cadenas de prototipos tras ejecutar eso:
Los constructores no son clases
En un sistema de objetos basado en clases, las clases típicamente heredan de otras, y los objetos son instancias de esas clases. Los métodos y propiedades que son compartidos entre instancias son (al menos conceptualmente) propiedades de clases. Las propiedades (y para algunos lenguajes, métodos) que no deben ser compartidos son propiedades de los mismos objetos.Los constructores de javascript no hacen nada parecido: de hecho los constructores tienen su propia cadena [[Prototype]] completamente separada de la cadena [[Prototype]] de objetos que ellos inicializan.
Los constructores no funcionan como inicializadores basados en clases
Una llamada a constructor asocia un nuevo objeto con un [[Prototype]]. La función constructor podría establecer propiedades adicionales sobre el objeto. Las llamadas a constructor no llaman constructores "heredados", y no deberían porque el [[Prototype]] del objeto (elprototype del constructor) se supone que está compartido y (probablemente) ya inicializado.
Los constructores sólo son funciones
Cualquier función definida por el usuario en javascript automáticamente obtiene una propiedadprototype que, en cambio, tiene una propiedad constructor que se refiere (de vuelta) a la función.Cualquier función definida por el usuario puede ser llamada como constructor anteponiéndole
new a la llamada. Esto pasará un nuevo objeto this a la funcion, y su propiedad [[Prototype]] se inicializará a la propiedad prototype de la función.
Notas al pie
[1] Hay clases definidas por el sistema: Function, Object, Array, Class, RegExp, Boolean, Number, Math, Date, Error y String. Un usuario no puede añadir una nueva clase, aunque el sistema podría definir más. Nótese que estas clases no son las misma que los objetos predefinidos (constructores) con el mismo nombre, y no pueden ser directamente accedidas de ninguna forma.Un constructor definido por el usuario que no devuelve explícitamente algo más siempre devuelve un objeto de la clase Object.
Referencias
A comp.lang.javascript question
Subject: "x.constructor == Foo" vs "x instanceof Foo".
Message-ID: <fniu6a$2cn$1@reader2.panix.com>
http://groups.google.com/group/comp.lang.javascript/msg/102ab20c68aa738f
Ecma-262
Standard ECMA-262. ECMAScript Language Specification 3rd edition (December 1999) http://www.ecma-international.org/publications/standards/Ecma-262.htm
Flanagan 2006
JavaScript: The Definitive Guide, Fifth Edition. ISBN 10: 0-596-10199-6 | ISBN 13:9780596101992
Author & copyright
(c)2008 Joost Diepenmaat, Zeekat Softwareontwikkeling.
MooTools Swiff
La versión 1.2 de Mootools incluye Swiff, un componente para interactuar con películas Flash. En el blog de MooTools acaban de publicar un tutorial.
Funciones `parciales´ con Javascript
En este artículo de John Resig se explica cómo crear funciones parciales, que son aquellas derivadas de otras existentes pero que tienen predefinido ya uno o varios argumentos al ser llamadas.
La función definida sobre el prototipo de Function que permite crear dichas funciones sería la siguiente:
Con esto, es sencillo crear funciones nuevas a partir de las existentes. Existen en el artículo otras técnicas que amplían aún más la funcionalidad (como por ejemplo el rellenar automáticamente los parámetros que no se especifiquen).
Function.prototype.partial = function(){
var fn = this, args = Array.prototype.slice.call(arguments);
return function(){
var arg = 0;
for ( var i = 0; i < args.length && arg < arguments.length; i++ )
if ( args[i] == undefined )
args[i] = arguments[arg++];
return fn.apply(this, args);
};
};
// Y UN EJEMPLO DE USO
String.prototype.csv = String.prototype.split.partial(/,\s*/);
var results = "John, Resig, Boston".csv();
alert( results[1] ); // IMPRIMIRIA "Resig"
Pro Javascript Design Patterns
Me he encontrado con este libro online publicado gratuitamente. Por cierto, Issuu es un excelente proyecto para publicar revistas o libros online con una excelente interfície.
Thrudb - faster, cheaper than SimpleDB - igvita.com
ThruDB
es un conjunto de servicios simples construidos sobre el framework Thrift de Facebook que provee servicios de almacenamiento e indexación de documentos para construir y escalar websites. Su propósito es ofrecer a los desarrolladores web servicios flexibles, rápidos y fáciles de usar que pueden mejorar o sustituir las capas tradicionales de acceso y almacenamiento de datos.
ThruDB provee un conjunto consistente de servicios:
Thrucene para indizar, Throxy para particionar y balancear la carga, y Thrudoc para almacenar los documentos.
Efectivamente, se trata de otro proyecto del estilo de CouchDB y del criticado servicio de Amazon, SimpleDB.