Por que?

9 views
Skip to first unread message

Tio Oscar

unread,
Jan 5, 2012, 3:33:18 PM1/5/12
to node...@googlegroups.com, webandbeer
Nada solo queria saber por que lo descubri hace poco y me di cuenta que tengo que corregir muchas clases que hize xD.

como todos sabran una clase en js es una función con prototipo, al instanciar la clase se crea un nuevo objeto copiando el prototipo, pero si este es un objeto, pasa a la instancia como referencia y no como copia, por ejemplo si ejecutan el siguiente codigo:

var a = function () {}

a.prototype.objeto = {a:'a'};
a.prototype.prop = 'a';

var ia = new a();
var ib = new a();

ia.prop = 'b';
ia.objeto.a = 'b';

console.log(ia.prop);
console.log(ia.objeto);

console.log(ib.prop);
console.log(ib.objeto);

El resultado es:

b
{ a: 'b' }
a
{ a: 'b' }

Osea, la propiedad "prop" cambiana en la instancia a, solo cambia en dicha instancia, mientras que al hacer ia.objeto.a = 'b';  se modifica para todas las instancias, ya que  tanto ia.objeto como ib.objeto son referencias a a.prototype.objeto.

Esto tambien pasa si hago la clase de este modo:

var a = function () {}

a.prototype = {
        objeto: {a:'a'},
        prop: 'a';
};


La unica forma de tener un objeto como propiedad sería creandolo en el constuctor:


var a = function () {
        this.prop = 'a';
        this.objeto = {a:'a'};
}

Ahora, me acabo de dar cuenta que muchas clases las tengo mal hechas, normalmente por uso:

classe.protoype = {

     options: {}

};

:S

En fin, alguien sabe por que esto es asi?

--
El Tio ~ Programador, hacker y filósofo
web: http://blog.exodica.com.ar
Linked'in: http://www.linkedin.com/in/ogentilezza
Twitter: @exos, Indeti.ca: @exos
Tels: [+54 11] 638-LINUX (54689) - [+54 9 11] 6799-4797

Demián Andrés Rodriguez

unread,
Jan 5, 2012, 3:44:16 PM1/5/12
to node...@googlegroups.com, webandbeer
Es básico, los objetos se copian por referencia, los primitivos no.
Primitivos:
var a = "puto";
var b = 5;
Objetos:
var a = []
var b = {}
new String("puto")
new Number(9)

2012/1/5 Tio Oscar <tio...@gmail.com>

Tio Oscar

unread,
Jan 5, 2012, 4:19:26 PM1/5/12
to node...@googlegroups.com, webandbeer
Es un tema, por lado esta bien, por el otro... tambien.

Según la wikipedia:

Programación basada en prototipos es un estilo de programación orientada a objetos en el cual, las "clases" no están presentes, y la re-utilización de procesos (conocida como herencia en lenguajes basados en clases) se obtiene a través de la clonación de objetos ya existentes, que sirven de prototipos, extendiendo sus funcionalidades. Este modelo es conocido como orientado a prototipos, o programación basada en instancias.

Clonar, segun la wikipedia:

La clonación (derivado del griego κλων, que significa "retoño") puede definirse como el proceso por el que se consiguen copias idénticas de un organismo, célula o molécula ya desarrollado de forma asexual.1

Como lo entendi:

El prototipo de un objeto se clona (si, incluyendo objetos) a un nuevo objeto, sea llamado instancia.

Ahora pienso:

Esto en un caso de inyección de dependencias estaria mal...

En fin, tampoco me lo habia imaginado asi.

tengo gasnas de llorar... nos vemos en la paceña
Reply all
Reply to author
Forward
0 new messages