herencia ejemplos javascript oop prototypal-inheritance prototype-programming

javascript - ejemplos - object js prototype



¿Cuál es la diferencia entre un objeto y un prototipo en la programación de prototipos? (2)

Estoy tratando de entender la "forma de JavaScript" de crear y usar objetos y creo que me estoy topando con un malentendido de un objeto y un prototipo.

En un nuevo proyecto que comencé, decidí probar la herencia prototípica. Estoy confundido si esto significa que debería crear un objeto que pretendo usar y luego crear otros objetos basados ​​en eso utilizando Object.create() como:

var labrador = { color: ''golden'', sheds: true, fetch: function() { // magic } }; var jindo = Object.create(dog); jindo.color = ''white'';

O si debo crear una clase de clase y eso crea instancias de eso usando Object.create() .

var Dog = { // Is this class-like thing a prototype? color: null, sheds: null, fetch: function() { // magic } }; var labrador = Object.create(Dog); labrador.color = ''golden''; labrador.sheds = true; var jindo = Object.create(Dog); jindo.color = ''white''; jindo.sheds = true;

Al tener mucha más experiencia en la POO basada en la clase, este último método se siente más cómodo para mí (y quizás eso sea motivo suficiente). Pero siento que el espíritu de herencia prototípica está más en la primera opción.

¿Qué método está más en el "espíritu" de la programación prototípica? ¿O me estoy perdiendo completamente el punto?


El prototype es solo otro objeto para el que un objeto tiene una referencia implícita.

Cuando tu lo hagas:

var obj = Object.create( some_object );

... estás diciendo que quieres que obj intente obtener propiedades de some_object , cuando no existen en obj .

Como tal, su segundo ejemplo estaría más cerca de la forma en que lo usaría. Cada objeto que se crea utilizando Object.create(Dog) tendrá en su cadena de prototipo , ese objeto Dog . Por lo tanto, si realiza un cambio en Dog , el cambio se reflejará en todos los objetos que tengan Dog en la cadena.

Si el objeto principal tiene la misma propiedad que existe en el objeto prototipo, esa propiedad está siguiendo esa propiedad del prototipo. Un ejemplo de eso serían los valores null que establece en las propiedades de Dog .

Si lo haces:

var lab = Object.create(Dog); lab.color = ''golden'';

... ahora estás siguiendo la propiedad del color en Dog , por lo que ya no obtendrás null . No estás cambiando el Dog de ninguna manera, así que si creo otro objeto:

var colorless_dog = Object.create(Dog);

... este aún obtendrá el valor null de la cadena de prototipo al acceder a la propiedad de color .

colorless_dog.color; // null

... hasta que lo ocultes:

colorless_dog.color = ''blue''; colorless_dog.color; // ''blue''

Así que dado tu ejemplo:

var lab = Object.create(Dog); lab.color = ''golden''; lab.sheds = true;

... se ve algo como esto:

// labrador // Dog lab.color---> color:''golden'' color:null lab.sheds---> sheds:true sheds:null lab.fetch()--------------------------> fetch: function() { alert( this.color ); // ''golden'' // "this" is a reference to the // "lab" object, instead of "Dog" }


Un prototipo es solo un objeto.

Es cualquier objeto que otro objeto usa como prototipo.