En JavaScript, todo objeto tiene una propiedad %%'__proto__'%% que referencia el objeto al cual el objeto delega. Por defecto, el padre de cada objeto es Object:
> o = {}
> o.__proto__
Object
> Object
function Object() { [native code] }
La propiedad %%'__proto__'%% se puede setear explicitamente para especificar quien es el objeto padre:
> o.x
undefined
> o.__proto__ = { x : 10 }
> o.x
10
También se puede especificar el padre en la sintaxis literal:
> a = { x : 10 }
> b = { y : 20, __proto__ : a }
> b.x
10
Las funciones son objetos, entonces tienen una propiedad %%'__proto__'%%, la cual por defecto apunta a una función con cuerpo vacío:
> f = function (x) { return x; }
> f.__proto__
function Empty() {}
> f.__proto__()
undefined
Como una función es un objeto, también puede delegar a otro objeto:
> f.__proto__ = { x : 10 }
> f.x
10
Una función no solamente parte con %%'__proto__'%%, sino que ademas parte con una propiedad llamada 'prototype'. Esta por defecto apunta a Object. Esta propiedad se usa para setear el %%'__proto__'%% de los objetos creados via 'new' con esta función:
> f = function() {}
> f.prototype
Object
> o = new f
> o.__proto__
Object
Ojo que //reasignar// el 'prototype' de una función no afecta el %%'__proto__'%% de los objetos ya creados a partir de esa función. Pero si, //mutar// este 'prototype' afecta los objetos ya creados.
> f.prototype = { x : 10 }
> o2 = new f
> o.x
undefined
> o2.x
10
> f.prototype.y = 20
> o2.y
20