programación programacion poo orientado orientada objetos herencia es6 caracteristicas javascript oop

poo - programacion orientada a objetos javascript



¿Está JavaScript orientado a objetos? (27)

¿Está JavaScript orientado a objetos?

Respuesta: si

Tiene objetos que pueden contener datos y métodos que actúan sobre esos datos. Los objetos pueden contener otros objetos.

  • No tiene clases, pero tiene constructores que hacen lo que hacen las clases, incluso actuando como contenedores para variables de clase y métodos.
  • No tiene herencia orientada a clases, pero sí tiene herencia orientada a prototipos.

Las dos formas principales de construir sistemas de objetos son por herencia (is-a) y por agregación (has-a). JavaScript hace ambas cosas, pero su naturaleza dinámica le permite sobresalir en la agregación.

Algunos argumentan que JavaScript no está realmente orientado a objetos porque no proporciona información oculta. Es decir, los objetos no pueden tener variables privadas y métodos privados: todos los miembros son públicos.

Pero resulta que los objetos de JavaScript pueden tener variables privadas y métodos privados. (Haga clic aquí ahora para descubrir cómo). Por supuesto, pocos entienden esto porque JavaScript es el lenguaje de programación más incomprendido del mundo.

Algunos argumentan que JavaScript no está realmente orientado a objetos porque no proporciona herencia. Pero resulta que JavaScript no solo admite la herencia clásica, sino también otros patrones de reutilización de códigos.

Fuentes: http://javascript.crockford.com/javascript.html

Ha habido algunas preguntas sobre si JavaScript es un lenguaje orientado a objetos. Incluso una declaración, "solo porque un lenguaje tenga objetos no lo convierte en OO".

Es JavaScript un lenguaje orientado a objetos?


A diferencia de la mayoría de los lenguajes orientados a objetos, JavaScript (antes de ECMA 262 Edición 4, de todos modos) no tiene ningún concepto de clases, sino prototipos. Como tal, de hecho es algo subjetivo si llamarlo orientado a objetos o no.

@eliben: Wikipedia dice que está basado en objetos. Eso no es lo mismo que orientado a objetos. De hecho, su artículo sobre la base de objetos distingue entre lenguajes orientados a objetos y prototipos, llamando explícitamente a JavaScript no orientado a objetos.


Creo que cuando puede seguir los mismos o similares patrones de diseño que un verdadero lenguaje OO como Java / C #, puede llamarlo prácticamente un lenguaje OO. Algunos aspectos son obviamente diferentes, pero aún puede usar patrones de diseño de OO muy bien establecidos.


Creo que mucha gente responde "no" a esta pregunta porque JavaScript no implementa clases, en el sentido tradicional de OO. Lamentablemente (en mi humilde opinión), viene en ECMAScript 4. Hasta entonces, viva la prototype! :-)


El episodio 146 de Hanselminutes mira OO Ajax. Fue un buen espectáculo y definitivamente un buen espectáculo para ayudar a formar una opinión.


Está orientado a objetos, pero no está basado en clases, se basa en prototipos.


Esto es por supuesto subjetivo y una pregunta académica. Algunas personas discuten si un lenguaje OO tiene que implementar clases y herencia, otros escriben programas que cambian tu vida. ;-)

(Pero en realidad, ¿por qué un lenguaje OO tiene que implementar clases? Creo que los objetos son los componentes clave. Cómo se crean y luego se usan es otro asunto).


Estoy respondiendo esta pregunta rebotada desde otro ángulo.

Este es un tema eterno, y podríamos abrir una guerra de llama en muchos foros.

Cuando las personas afirman que JavaScript es un lenguaje de programación OO porque pueden usar OOD con esto, entonces pregunto: ¿Por qué no es C un lenguaje de programación OO? Repito, puedes usar OOD con C y si dijiste que C es un lenguaje de programación de OO, todos te dirán que estás loco.

Podríamos poner aquí muchas referencias sobre este tema en libros y foros muy antiguos, porque este tema es más antiguo que Internet :)

JavaScript no ha cambiado durante muchos años, pero los nuevos programadores quieren mostrar que JavaScript es un lenguaje de programación OO. ¿Por qué? JavaScript es un lenguaje potente, pero no es un lenguaje de programación OO.

Un lenguaje de programación OO debe tener objetos, método, propiedad, clases, encapsulación, agregación, herencia y polimorfismo. Podría implementar todos estos puntos, pero JavaScript no los tiene.

Un ejemplo muy ilustrativo: en el capítulo 6 de "JavaScript orientado a objetos", describa 10 maneras para implementar "herencia". ¿Cuántas maneras hay en Java? Uno, y en C ++? Uno, y en Delphi (Object Pascal)? Uno, y en Objective-C? Uno.

¿Por qué es esto diferente? Porque Java, C ++, Delphi y Objective-C están diseñados con OOP en mente, pero no con JavaScript.

Cuando era estudiante (en 1993), en la universidad, había un trabajo doméstico típico: implementar un programa diseñado utilizando un OOD (diseño orientado a objetos) con un lenguaje que no sea OO. En esos momentos, el idioma seleccionado era C (no C ++). El objetivo de estas prácticas era dejar en claro la diferencia entre OOD y OOP, y podría diferenciar entre lenguajes OOP y no OOP.

De todos modos, es evidencia de que no todas las personas tienen alguna opinión sobre este tema :)

De todos modos, en mi opinión, JavaScript es un lenguaje poderoso y el futuro en la capa del lado del cliente.


IMO (y es solo una opinión) la característica clave de un lenguaje orientado a objetos sería que soportaría el polymorphism . Prácticamente todos los lenguajes dinámicos hacen eso.

La siguiente característica sería la encapsulation y eso es bastante fácil de hacer en Javascript también.

Sin embargo, en la mente de muchos, es la inheritance (específicamente la herencia de implementación) lo que inclinaría la balanza en cuanto a si un lenguaje califica para llamarse orientado a objetos.

Javascript proporciona un medio bastante fácil de heredar la implementación a través de la creación de prototipos, pero esto es a expensas de la encapsulación.

Entonces, si su criterio para la orientación del objeto es el clásico conjunto de polimorfismo, encapsulación y herencia, entonces Javascript no pasa.

Editar : se plantea la pregunta complementaria "¿cómo encapsula la herencia prototípica la encapsulación?" Considere este ejemplo de un enfoque no prototípico:

function MyClass() { var _value = 1; this.getValue = function() { return _value; } }

El atributo _value está encapsulado, no puede ser modificado directamente por un código externo. Podríamos agregar un mutador a la clase para modificarlo de una manera totalmente controlada por código que es parte de la clase. Ahora considere un enfoque prototípico para la misma clase:

function MyClass() { var _value = 1; } MyClass.prototype.getValue = function() { return _value; }

Bueno, esto está roto. Como la función asignada a getValue ya no está en el alcance con _value, no puede acceder a ella. Necesitaríamos promover _value a un atributo de this pero eso lo haría accesible fuera del control del código escrito para la clase, por lo tanto, la encapsulación se rompe.

A pesar de esto, mi voto sigue siendo que Javascript está orientado a objetos. ¿Por qué? Porque dado un OOD puedo implementarlo en Javascript.


JavaScript es un lenguaje de programación basado en prototipos (probablemente el lenguaje de scripting basado en prototipos es una definición más correcta). Emplea la clonación y no la herencia. Un lenguaje de programación basado en prototipos es un estilo de programación orientada a objetos sin clases. Si bien los lenguajes de programación orientados a objetos fomentan el enfoque de desarrollo en la taxonomía y las relaciones, los lenguajes de programación basados ​​en prototipos alientan a centrarse primero en el comportamiento y luego en clasificarlo.

El término "orientado a objetos" fue acuñado por Alan Kay en 1967, quien lo explica en 2003 con el significado

solo mensajes, retención local y protección y ocultamiento del proceso de estado, y enlace extremo de todas las cosas. (source)

En la programación orientada a objetos, cada objeto es capaz de recibir mensajes, procesar datos y enviar mensajes a otros objetos.

Para que un lenguaje esté orientado a objetos, puede incluir características como encapsulación, modularidad, polimorfismo y herencia, pero no es un requisito. Los lenguajes de programación orientados a objetos que hacen uso de las clases a menudo se denominan lenguajes de programación basados ​​en clases, pero de ninguna manera es obligatorio hacer uso de las clases para que estén orientadas a objetos.

JavaScript usa prototipos para definir las propiedades del objeto, incluidos los métodos y la herencia.

Conclusión: JavaScript está orientado a objetos.


JavaScript es un muy buen lenguaje para escribir aplicaciones web orientadas a objetos. Puede admitir OOP porque admite herencia a través de creación de prototipos, también propiedades y métodos. Puede tener polimorfismo, encapsulación y muchos paradigmas de subclasificación.


JavaScript está basado en objetos, no está orientado a objetos. La diferencia es que los lenguajes basados ​​en objetos no admiten herencia propia, mientras que los orientados a objetos sí.

Hay una manera de lograr herencia ''normal'' en JavaScript ( here ), pero el modelo básico se basa en la creación de prototipos.


JavaScript está orientado a objetos, pero no es un lenguaje orientado a objetos basado en clases como Java, C ++, C #, etc. Los lenguajes OOP basados ​​en clases son un subconjunto de la familia más amplia de lenguajes OOP que también incluyen lenguajes basados ​​en prototipos como JavaScript y yo.


Javascript es un lenguaje multi-paradigma que admite estilos de programación procedurales, orientados a objetos (basados ​​en prototipos) y funcionales.

Aquí hay un article sobre cómo hacer OO en Javascript.


Javascript no es un lenguaje orientado a objetos como se suele considerar, principalmente debido a la falta de herencia verdadera, la tipificación DUCK permite una forma semi-verdadera de herencia / polimorfismo junto con el Object.prototype que permite el uso compartido complejo de funciones. En su esencia, sin embargo, la falta de herencia conduce a un polimorfismo débil, ya que la tipificación DUCK insiste en que algún objeto con los mismos nombres de atributos es una instancia de un Objeto para el que no estaban destinados. Por lo tanto, la adición de atributos al objeto aleatorio transforma la base de su tipo en una manera de hablar.


La Microsoft Ajax Client Library simplifica la implementación de OO en javascript. Es compatible con inharitence y la implementación de interfaz.


La respuesta corta es sí. Para más información:

De la Wikipedia :

JavaScript está fuertemente basado en objetos. Los objetos son matrices asociativas, aumentadas con prototipos (ver abajo). Los nombres de propiedad de objeto son claves de matriz asociativa: obj.x = 10 y obj ["x"] = 10 son equivalentes, la notación de punto es simplemente azúcar sintáctica. Las propiedades y sus valores se pueden agregar, cambiar o eliminar en tiempo de ejecución. Las propiedades de un objeto también se pueden enumerar mediante un ciclo for ... in.

Además, vea esta serie de artículos sobre OOP con Javascript.


Los lenguajes no necesitan comportarse exactamente como Java para estar orientados a objetos. Todo en Javascript es un objeto; compare con C ++ o Java anterior, que se consideran ampliamente orientadas a objetos hasta cierto punto, pero aún se basan en primitivas. El polimorfismo no es un problema en Javascript, ya que no le importan mucho los tipos en absoluto. La única característica principal de OO no soportada directamente por la sintaxis es la herencia, pero que se puede implementar fácilmente, sin embargo, el programador quiere usar prototipos: here hay uno de esos ejemplos.


Los objetos en JavaScript heredan directamente de los objetos. ¿Qué puede ser más orientado a objetos?


Misko Hevery hizo un excelente Google Tech Talk introductorio en el que habla sobre objetos en Javascript. Descubrí que este es un buen punto de partida para las personas que cuestionan el uso de objetos en Javascript o que desean comenzar a usarlos:


Personalmente, la atracción principal de la programación OOP es la capacidad de tener clases autónomas con funciones internas no expuestas (privadas).

Lo que me confunde sin fin en Javascript es que ni siquiera puede usar nombres de funciones, porque corre el riesgo de tener el mismo nombre de función en otro lugar en cualquiera de las bibliotecas externas que está utilizando.

A pesar de que algunas personas muy inteligentes han encontrado soluciones para esto, ¿no es extraño que Javascript en su forma más pura requiere que cree un código que es muy ilegible?

La belleza de OOP es que puede pasar el tiempo pensando en la lógica de su aplicación, sin tener que preocuparse por la sintaxis.


Sí lo es. Sin embargo, no admite todas las características que cabría esperar en un lenguaje de programación orientado a objetos que carezca de herencia y polimorfismo. Sin embargo, esto no significa que no pueda simular estas capacidades a través del sistema de creación de prototipos disponible para el idioma.



Técnicamente es un lenguaje prototipo, pero es fácil hacer OO en él.


Todo en javascript es un objeto: las clases son objetos, las funciones son objetos, los números son objetos, los objetos son objetos. No es tan estricto sobre escribir como otros idiomas, pero definitivamente es posible escribir OOP JS.


Yo diría que tiene la capacidad de parecer OO. Especialmente si aprovecha su capacidad para crear métodos en un objeto existente (métodos anónimos en algunos idiomas). Las librerías de scripts de cliente como jquery (jquery.com) o prototype (prototypejs.org) son buenos ejemplos de bibliotecas que aprovechan esto, haciendo que javascript se comporte como un OO.