He programado con lenguajes de programación orientada a objetos durante más de 10 años, pero ahora estoy aprendiendo JavaScript y es la primera vez que me encuentro con la herencia basada en prototipos. Tiendo a aprender más rápido al estudiar un buen código. ¿Qué es un ejemplo bien escrito de una aplicación (o biblioteca) de JavaScript que utiliza correctamente la herencia de prototipos? ¿Y puede describir (brevemente) cómo / dónde se usa la herencia prototípica, para saber por dónde empezar a leer?
javascript
prototypal-inheritance
Alex Reisner
fuente
fuente
Respuestas:
Douglas Crockford tiene una bonita página sobre herencia de prototipos de JavaScript :
Base.js de Dean Edward , la clase de Mootools o las obras de herencia simple de John Resig son formas de hacer herencia clásica en JavaScript.
fuente
newObj = Object.create(oldObj);
si lo quieres sin clases? De lo contrario, ¿oldObj
debería funcionar reemplazar con el objeto prototipo de la función constructora?Como se mencionó, las películas de Douglas Crockford dan una buena explicación sobre el por qué y cubren el cómo. Pero para ponerlo en un par de líneas de JavaScript:
Sin embargo, el problema con este enfoque es que volverá a crear el objeto cada vez que cree uno. Otro enfoque es declarar sus objetos en la pila de prototipos, así:
Hay un pequeño inconveniente en lo que respecta a la introspección. El volcado de testOne resultará en información menos útil. También la propiedad privada "privateVariable" en "testOne" se comparte en todos los casos, como se menciona en las respuestas de shesek.
fuente
privateVariable
es simplemente una variable en el alcance del IIFE y se comparte en todas las instancias, por lo que no debe almacenar datos específicos de la instancia en ella. (en testTwo es específico de la instancia, ya que cada llamada a testTwo () crea un nuevo alcance por instancia)Dog.prototype
. Entonces, en lugar de usarthis.bark = function () {...}
, podemos hacerloDot.prototype.bark = function () {...}
fuera de laDog
función. (Ver más detalles en esta respuesta )fuente
Echaría un vistazo a YUI y a la
Base
biblioteca de Dean Edward : http://dean.edwards.name/weblog/2006/03/base/Para YUI, puede echar un vistazo rápido al módulo lang , esp. el método YAHOO.lang.extend . Y luego, puede buscar la fuente de algunos widgets o utilidades y ver cómo usan ese método.
fuente
lang
está medio roto. ¿Alguien quiere arreglarlo para YUI 3?También está la biblioteca ASP.NET Ajax de Microsoft , http://www.asp.net/ajax/ .
También hay muchos buenos artículos de MSDN, incluido Crear aplicaciones web avanzadas con técnicas orientadas a objetos .
fuente
Este es el ejemplo más claro que he encontrado, del libro Node de Mixu ( http://book.mixu.net/node/ch6.html ):
fuente
ES6
class
yextends
ES6
class
yextends
son solo azúcar de sintaxis para la manipulación de la cadena de prototipos previamente posible y, por lo tanto, posiblemente la configuración más canónica.Primero, obtenga más información sobre la
.
búsqueda de propiedades y cadenas de prototipos en: https://stackoverflow.com/a/23877420/895245Ahora deconstruyamos lo que sucede:
Diagrama simplificado sin todos los objetos predefinidos:
fuente
Sugiero mirar PrototypeJS 'Class.create:
Line 83 @ http://prototypejs.org/assets/2009/8/31/prototype.js
fuente
Los mejores ejemplos que he visto están en JavaScript de Douglas Crockford : The Good Parts . Definitivamente vale la pena comprarlo para ayudarlo a obtener una visión equilibrada del idioma.
Douglas Crockford es responsable del formato JSON y trabaja en Yahoo como un gurú de JavaScript.
fuente
Hay un fragmento de herencia basada en un prototipo de JavaScript con implementaciones específicas de la versión de ECMAScript. Automáticamente elegirá cuál usar entre las implementaciones de ES6, ES5 y ES3 de acuerdo con el tiempo de ejecución actual.
fuente
Añadiendo un ejemplo de herencia basada en prototipos en Javascript.
ES6 usa una implementación de herencia mucho más fácil con el uso de constructor y super palabras clave.
fuente