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