This is an old revision of the document!


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

Que es Object? una función nativa:

> 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 un proto, el cual por defecto es 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