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