Lenguajes basados en clases frente a basados en prototipos

  • Enlace amigable (slug) de la revisión: Guía_JavaScript_1.5/Lenguajes_basados_en_clases_frente_a_basados_en_prototipos
  • Título de la revisión: Lenguajes basados en clases frente a basados en prototipos
  • Id de la revisión: 266344
  • Creada:
  • Creador: Sairgo
  • ¿Es la revisión actual? No
  • Comentario /* Resumen de las Diferencias */

Contenido de la revisión

Lenguajes basados en Clases vs. Basados en Prototipos

Los lenguajes orientados a objetos basados en Clases, tales como Java and C++, están fundamentados sobre el concepto de dos entidades distintas: las clases y las instancias.

  • Una clase define todas las propiedades (considerando los métodos y los campos en Java, o miembros en C++, para considerarse como propiedades) que caracterizan a un cierto conjunto de objetos. Una clase es una cosa abstracta, más que cualquier miembro particular de un conjunto de objetos que describe. Por ejemplo, la clase Empleado podría representar el conjunto de todos los empleados.
  • Una instancia, por otro lado, es la instanciación de una clase; esto es, uno de sus miembros. Por ejemplo, Victoria podría ser una instancia de la clase Empleado, representando a un individuo particualr como un empleado. Una instancia tiene extactamente las propiedades de su clase padre (no más, no menos)

Un lenguaje basado en prototipos, tal como JavaScript, no hace esta distinción, simplemente tiene objetos. Un lenguaje basado en prototipos tiene la noción de un objeto prototipo, un objeto utilizado como una plantilla de la cual se obtiene las propiedades iniciales para un nuevo objeto. Cualquir objeto puede especificars sus propias propiedades, tanto al ser creado o en tiempo de ejecución. Adicionalmente, cualquier objeto puede estar asociado como el prototipo de cualquier otro objeto, permitiendo que el segundo objeto comparta las propiedades del primer objeto.

Definiendo una Clase

En los lenguajes basados en clases, se define una clase en una definición de clase separada. En esta definición puede especificar métodos especiales, llamados constructores, para crear instancias de una clase. Un método constructor puede especificar valores iniciales para las propiedades de la instancia y desarrollando procesamiento apropiado en tiempo de creación. Utilice el operador new en asociación con el método constructor para cear instancias de las clases.

JavaScript sigue un modelo similar, pero no tiene una definción de clase por separado del constructor. En su lugar, define una función constructora para crear objetos con un conjunto inicial particular de propiedades y valores. Cualquier función JavaScript puede ser utilizada como un constructor. Utilice el operador new con una función constructora para crear un nuevo objeto.

Subclases y Herencia

Un lenguaje basado en clases, crea una jerarquía de clases por medio de la definción de clases. En una definición de clases, puede especificar que la nueva clase sea una subclase de una clase ya existente. La subclase hereda todas las propiedades de la superclase y adicionalmente puede añadir nuevas propiedades o modificar las heredadas. Por ejemplo, asumiendo que la clase Empleado incluye solamente las propiedades del nombre y departamento y que Administrador es una subclase de Empleado que añade la propiedad reporta. En este caso, una instancia de la clase administrador puede tener tres propiedades: nombre, departamento y reporta.

JavaScript implementa la herencia permitiendo asociar un objeto prototipo con cualquier función constructora. Así que, puede crear exactamente el ejemplo Empleado-Administrador, pero utiliza una terminología ligeramente diferente. Primero defina la función constructora de Empleado, especificando las propiedades del nombre y departamento. Luego, defina una función constructora Administrador, especificando la propiedad reporta. Finalmente, asigne un nuevo objeto Empleado como el prototipo para la función constructora Administrador. Luego, cuando cree un nuevo Administrador, este hereda las propiedades de nombre y departamento del objeto Empleado.

Añadiendo y Removiendo Propiedades

En los lenguajes basados en clases, tipicamente crea una clase en tiempo de compilación y luego instnacia la clase ya sea en tiempo de comilación o en tiempo de ejecución. No puede cambiar el número o tipo de las propiedades de una clase desuùes de definir la clase. In JavaScript, sin embargo, en tiempo de ejecución puede añadir o remover propiedades de cualquir objeto. Si añade una propiedad a un objeto que es utilizado como prototipo para un conjunto de objetos, los objetos par los cuales este es el prototipo también obtienen la nueva propiedad.

Resumen de las Diferencias

La tabla siguiente ofrece un corto resumen de estas diferencias. El resto de este capítulo describe los detalles del uso de constructores y prototipos para crear una jerarquía de objettos y la compara a como lo debería hace en Java.

Basado en Clases (Java) Basado en Prototipos (JavaScript)
Clase e instancia son entidades distintas. Todos los objetos son instancias.
Define una clase con la definción de clase; instancoa una clase con los métodos constructores. Define y crea un conjunto de objetos con las funciones constructoras.
Crea un único objeto con el operador new. Igualmente.
Construye una jerarquía de objetos utilizando las definiciones de clases par definir subclases de una clase existente. Construye una jerarquía de objetos mediante la asignación de un objeto como prototipo asociado con la función constructora.
Hereda las propiedades mediante el seguimiento de la cadena de clases. Hereda las propiedades mediante el seguimento de la cadena de prototipos.
La definción de Clases especifica todas las propiedades de todas las intancias de una clase. No puede aladir propiedades dinámicamente en tiempo de ejecución. La función constructora o prototipo puede especificar un conjunto inicial de propiedades. Puede añadir o remover dinámicamente a objetos individuales o a un conjunto entero de objetos.

{{template.AnteriorSiguiente("Guía JavaScript 1.5:Objetos base predefinidos:Objeto String", "Guía JavaScript 1.5:El ejemplo Employee")}}

{{ wiki.languages( { "en": "en/Core_JavaScript_1.5_Guide/Class-Based_vs._Prototype-Based_Languages", "fr": "fr/Guide_JavaScript_1.5/Langages_bas\u00e9s_sur_les_classes_et_langages_bas\u00e9s_sur_les_prototypes", "ja": "ja/Core_JavaScript_1.5_Guide/Class-Based_vs._Prototype-Based_Languages", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/J\u0119zyki_oparte_na_klasach_vs._oparte_na_prototypach", "zh-cn": "cn/Core_JavaScript_1.5_Guide/Class-Based_vs._Prototype-Based_Languages" } ) }}

Fuente de la revisión

<p>
</p>
<h3 name="Lenguajes_basados_en_Clases_vs._Basados_en_Prototipos"> Lenguajes basados en Clases vs. Basados en Prototipos </h3>
<p>Los lenguajes orientados a objetos basados en Clases, tales como Java and C++, están fundamentados sobre el concepto de dos entidades distintas: las clases y las instancias.
</p>
<ul><li> Una clase define todas las propiedades (considerando los métodos y los campos en Java, o miembros en C++, para considerarse como propiedades) que caracterizan a un cierto conjunto de objetos. Una clase es una cosa abstracta, más que cualquier miembro particular de un conjunto de objetos que describe. Por ejemplo, la clase Empleado podría representar el conjunto de todos los empleados.
</li></ul>
<ul><li> Una instancia, por otro lado, es la instanciación de una clase; esto es, uno de sus miembros. Por ejemplo, Victoria podría ser una instancia de la clase Empleado, representando a un individuo particualr como un empleado. Una instancia tiene extactamente las propiedades de su clase padre (no más, no menos)
</li></ul>
<p>Un lenguaje basado en prototipos, tal como JavaScript, no hace esta distinción, simplemente tiene objetos. Un lenguaje basado en prototipos tiene la noción de un objeto prototipo, un objeto utilizado como una plantilla de la cual se obtiene las propiedades iniciales para un nuevo objeto. Cualquir objeto puede especificars sus propias propiedades, tanto al ser creado o en tiempo de ejecución. Adicionalmente, cualquier objeto puede estar asociado como el prototipo de cualquier otro objeto, permitiendo que el segundo objeto comparta las propiedades del primer objeto.
</p>
<h4 name="Definiendo_una_Clase"> Definiendo una Clase </h4>
<p>En los lenguajes basados en clases, se define una clase en una definición de clase separada. En esta definición puede especificar métodos especiales, llamados constructores, para crear instancias de una clase. Un método constructor puede especificar valores iniciales para las propiedades de la instancia y desarrollando procesamiento apropiado en tiempo de creación. Utilice el operador new en asociación con el método constructor para cear instancias de las clases.
</p><p>JavaScript sigue un modelo similar, pero no tiene una definción de clase por separado del constructor. En su lugar, define una función constructora para crear objetos con un conjunto inicial particular de propiedades y valores. Cualquier función JavaScript puede ser utilizada como un constructor. Utilice el operador new con una función constructora para crear un nuevo objeto.
</p>
<h4 name="Subclases_y_Herencia"> Subclases y Herencia </h4>
<p>Un lenguaje basado en clases, crea una jerarquía de clases por medio de la definción de clases. En una definición de clases, puede especificar que la nueva clase sea una subclase de una clase ya existente. La subclase hereda todas las propiedades de la superclase y adicionalmente puede añadir nuevas propiedades o modificar las heredadas. Por ejemplo, asumiendo que la clase Empleado incluye solamente las propiedades del nombre y departamento y que Administrador es una subclase de Empleado que añade la propiedad reporta. En este caso, una instancia de la clase administrador puede tener tres propiedades: nombre, departamento y reporta.
</p><p>JavaScript implementa la herencia permitiendo asociar un objeto prototipo con cualquier función constructora. Así que, puede crear exactamente el ejemplo Empleado-Administrador, pero utiliza una terminología ligeramente diferente. Primero defina la función constructora de Empleado, especificando las propiedades del nombre y departamento. Luego, defina una función constructora Administrador, especificando la propiedad reporta. Finalmente, asigne un nuevo objeto Empleado como el prototipo para la función constructora Administrador. Luego, cuando cree un nuevo Administrador, este hereda las propiedades de nombre y departamento del objeto Empleado.
</p>
<h4 name="A.C3.B1adiendo_y_Removiendo_Propiedades"> Añadiendo y Removiendo Propiedades </h4>
<p>En los lenguajes basados en clases, tipicamente crea una clase en tiempo de compilación y luego instnacia la clase ya sea en tiempo de comilación o en tiempo de ejecución. No puede cambiar el número o tipo de las propiedades de una clase desuùes de definir la clase. In JavaScript, sin embargo, en tiempo de ejecución puede añadir o remover propiedades de cualquir objeto. Si añade una propiedad a un objeto que es utilizado como prototipo para un conjunto de objetos, los objetos par los cuales este es el prototipo también obtienen la nueva propiedad.
</p>
<h4 name="Resumen_de_las_Diferencias"> Resumen de las Diferencias </h4>
<p>La tabla siguiente ofrece un corto resumen de estas diferencias. El resto de este capítulo describe los detalles del uso de constructores y prototipos para crear una jerarquía de objettos y la compara a como lo debería hace en Java.
</p>
<table class="fullwidth-table">
<tbody><tr>
<th>Basado en Clases (Java)</th>
<th>Basado en Prototipos (JavaScript)</th>
</tr>
<tr>
<td>Clase e instancia son entidades distintas.  </td>
<td>Todos los objetos son instancias.  </td>
</tr>
<tr>
<td>Define una clase con la definción de clase; instancoa una clase con los métodos constructores.  </td>
<td>Define y crea un conjunto de objetos con las funciones constructoras.  </td>
</tr>
<tr>
<td>Crea un único objeto con el operador <code>new</code>.  </td>
<td>Igualmente.  </td>
</tr>
<tr>
<td>Construye una jerarquía de objetos utilizando las definiciones de clases par definir subclases de una clase existente.  </td>
<td>Construye una jerarquía de objetos mediante la asignación de un objeto como prototipo asociado con la función constructora. </td> 
</tr>
<tr>
<td>Hereda las propiedades mediante el seguimiento de la cadena de clases.  </td>
<td>Hereda las propiedades mediante el seguimento de la cadena de prototipos.  </td>
</tr>
<tr>
<td>La definción de Clases especifica todas las propiedades de todas las intancias de una clase. No puede aladir propiedades dinámicamente en tiempo de ejecución.  </td>
<td>La función constructora o prototipo puede especificar un conjunto inicial de propiedades. Puede añadir o remover dinámicamente a objetos individuales o a un conjunto entero de objetos.   </td>
</tr>
</tbody></table>
<div class="noinclude">
<p>{{template.AnteriorSiguiente("Guía JavaScript 1.5:Objetos base predefinidos:Objeto String", "Guía JavaScript 1.5:El ejemplo Employee")}}
</p>
</div>
{{ wiki.languages( { "en": "en/Core_JavaScript_1.5_Guide/Class-Based_vs._Prototype-Based_Languages", "fr": "fr/Guide_JavaScript_1.5/Langages_bas\u00e9s_sur_les_classes_et_langages_bas\u00e9s_sur_les_prototypes", "ja": "ja/Core_JavaScript_1.5_Guide/Class-Based_vs._Prototype-Based_Languages", "pl": "pl/Przewodnik_po_j\u0119zyku_JavaScript_1.5/J\u0119zyki_oparte_na_klasach_vs._oparte_na_prototypach", "zh-cn": "cn/Core_JavaScript_1.5_Guide/Class-Based_vs._Prototype-Based_Languages" } ) }}
Revertir a esta revisión