JavaScript es el segundo lenguaje de programación con el que entré en contacto después del lenguaje C. Durante mis vacaciones de verano de primer año, encontré una programación de JavaScript escrita china en la biblioteca. En ese momento, era casi un novato en la programación. Además, el libro no mencionó el mecanismo de programación de JavaScript en absoluto, y hubo algunas palabras engañosas. Siempre he tenido un profundo malentendido de JavaScript, creyendo que JavaScript es solo un lenguaje orientado a objetos que se ejecuta en el navegador. Escribiré este artículo que es confuso y mal entendido en JavaScript. Por supuesto, debido al nivel limitado del autor y sin experiencia en desarrollo, inevitablemente hay omisiones, y espero que se hagan críticas y correcciones.
Objetos JavaScript
Que es el objeto
La nueva palabra clave se puede ver en todas partes en el código JavaScript, que es fácil de malinterpretar que JavaScript es un idioma basado en la herencia de clase, al igual que Java. Pero este no es el caso. No hay clases en JavaScript. Entonces, ¿cuál es el objeto de JavaScript que no es una clase? En cierto sentido, los objetos JavaScript son diccionarios (tablas hash) en Python, y en realidad son pares de valor clave similares a este:
me = {"fisrtname": "buscar", "lastname": "verdad", "getName": function () {return this.firstname+this.lastName; // Esto es equivalente a un puntero a este objeto}}Este es un malentendido bastante. Cuando lo vi por primera vez, me sentí un poco incomprensible, pero aún así sentí que era razonable usarlo con cuidado. Podemos usar el operador [] para obtener elementos como Python, o usar el. operador para obtener elementos:
me.firstname // => Seekme ["LastName"] // => verdadero.getName () // => SeekTruth
nuevo operador
Dado que no hay clase en JavaScript, ¿qué está haciendo el nuevo operador? Este es uno de los aspectos más engañosos del diseño de JavaScript. JavaScript es un lenguaje de programación funcional. Las funciones en JavaScript son ciudadanos de primera clase, y las funciones en JavaScript también son objetos. Los objetos de función se agregarán para llamar a los atributos cuando se creen. Lo que es más trampa es que hay dos formas de llamar a las funciones de JavaScript. Una es llamar con la nueva palabra clave, y la otra es llamar sin la nueva palabra clave. El primero devolverá un objeto, y el segundo devolverá el contenido de la declaración de devolución. Considere la siguiente función:
función obj (name) {this.name = name; nombre de retorno;}Si usamos el nuevo operador para llamar:
obj = nuevo obj ("SeekTruth") // Obj será un objeto: {"Nombre": "SeekTruth"}
Si llamamos directamente:
obj = obj ("SeekTruth") // Obj será una cadena: "SeekTruth"
De hecho, es un diseño muy complicado. Cuando llamamos, debemos distinguir si necesitamos usar nuevo. En términos generales, las funciones que necesitan usar la nueva palabra clave comenzarán con la capitalización.
Otra cosa complicada es que si el valor de retorno devuelto es un objeto:
función obj (name) {this.name = name; devolver {};}De esta manera, independientemente de si llamamos al nuevo operador o no, devolveremos el valor en la declaración de devolución:
nuevo obj ("SeekTruth") // => {} obj ("SeekTruth") // => {}¿Qué diablos está diseñado ...
Herencia de objetos
prototipo
Como se mencionó anteriormente, no hay clase en JavaScript, entonces, ¿cómo implementa JavaScript la herencia? La respuesta es a través de la cadena prototipo. En JavaScript, cada objeto tiene un prototipo. Al crear un objeto, si no se especifica, el prototipo heredado por el objeto es objeto.prototype. El objeto de función heredará function.prototype (function.prototype heredado objeto.prototype):
Objeto.prototype // => {} function.prototype // => [función]Podemos ver el prototipo del objeto a través de la familiaridad __proto__ del objeto:
a = {} a .__ proto__ // => {}JavaScript implementa la herencia especificando el prototipo del objeto. Hay tres formas principales de especificar el prototipo del objeto. Una es para indicar el prototipo en el constructor, el segundo es modificar directamente el atributo __proto__ del objeto, y el tercero es usar la función object.create. Echemos un vistazo a su vez.
Especificar el prototipo en el constructor
Podemos especificar el prototipo del objeto en el constructor:
ME = {"FirstName": "Seek", "LastName": "Verdad", "GetName": function () {return this.firstName+this.lastName; // Esto es equivalente a un puntero a este objeto}} function obj (name) {this.firstname = name; esto .__ proto__ = yo; // Especifique el prototipo como un objeto ME}Después de especificar el prototipo, podemos acceder a las propiedades del prototipo después de crear un nuevo objeto:
obj = nuevo obj ("foo"); // => {FirstName: 'foo'} obj.firstname // => fooobj.lastname // => truthobj.getName () // => "footruth"Al acceder a un objeto, primero intentará encontrar la propiedad en el objeto modificado. Si no, vuelve al prototipo para buscar hasta object.prototype. Si reescribimos las propiedades (métodos) en el prototipo en un nuevo objeto, entonces cuando lo usamos, las propiedades recién escritas (métodos) sobrescribirán la definición en el prototipo, que es un poco similar a la sobrecarga de funciones en un lenguaje basado en clases.
Tenga en cuenta que si la propiedad de LastName del objeto Prototype ME ha cambiado, porque el objeto OBJ está buscando propiedades en el prototipo, la propiedad de LastName del objeto OBJ también cambiará:
me.lastname = "me" obj.lastname // => "me" obj.getName () // => "foome"
Cambiar el prototipo del objeto directamente
También podemos especificar directamente (cambiar) el prototipo del objeto:
obj2 = {} obj2 .__ proto__ = meobj2.firstname // => seekobj2.lastname // => "me" obj2.getName () // => "Seekme"Use la función object.create
Aunque los dos primeros métodos pueden resolver el problema, estas dos formas de escritura no son elegantes, porque JavaScript no es un lenguaje basado en la clase, y la primera forma de escribir es fácil de malinterpretar. Crockford, el autor de The Essence of JavaScript Language, cree que lo nuevo no debe aparecer en el lenguaje JavaScript, y se recomienda usar la función Object.Create para crear objetos basados en el prototipo. El uso del objeto. La función de creación es muy simple:
obj3 = object.create (me) // crea un nuevo objeto conmigo como prototipo obj3.firstname // => seekobj3.lastname // => "me" obj3.getName () // => "Seekme"
obj3 = object.create (me) es equivalente a obj2 = {}; obj2.proto = me, pero el primero está escrito de manera más elegante y fácil de entender.
Resumir
Como un lenguaje de programación funcional y basado en prototipos, JavaScript tiene mucha elegancia y potencia en el diseño, pero al mismo tiempo tiene muchos escudos y dificultades. Para la mayoría, JavaScript es también el lenguaje que es más incomprendido. Después de aprender el mecanismo de herencia de objetos de JavaScript, siento que mi nivel ha mejorado mucho.
La breve discusión anterior de los objetos y la herencia de JavaScript es todo el contenido que comparto con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.