JavaScript no hace tener clases como otros han dicho. La herencia se resuelve a través de la creación de prototipos que, en esencia, no hace más que crear referencias de propiedades no eliminables en un objeto recién creado. JavaScript también tiene alternativas para objetos de datos simples, a saber, literales de objetos.
la variación de una 'clase' en JavaScript debería definirse como tal:
// I use function statements over variable declaration
// when a constructor is involved.
function Person(name) {
this.name = name;
}
// All instances of Person create reference methods to it's prototype.
// These references are not deletable (but they can be overwritten).
Person.prototype = {
speak: function(){
alert(this.name + ' says: "Hello world!"');
}
};
var Mary = new Person('Mary');
Mary.speak(); // alerts 'Mary says: "Hello world!"'
La referencia this
siempre apunta a la titular de la function
. Si llama al Person
sin el operador new
, el propietario será el alcance global (ventana). Si no utiliza esta referencia para asignar propiedades a su instancia, entonces las propiedades simplemente se declararán como variables. Si no usa la instrucción var
, esas declaraciones crearán variables globales que son malas.
más sobre este
Utilizando la referencia this
en una función constructora es muy importante si desea agregar propiedades a la instancia actual. Sin usar this
, solo crea una variable (que no es lo mismo que una propiedad) y como se mencionó, si no usa la instrucción var tampoco, crea variables globales.
function Person(){
name = 'Mary'
}
var p = new Person();
alert(p.name); // undefined, did not use 'this' to assign it to the instance.
alert(name); // 'Mary', boo, it created a global variable!
¡Utilice esto!
function Person(){
this.name = 'Mary'
}
var p = new Person();
alert(p.name); // 'Mary', yay!
alert(name); // undefined, yay!
Nota, nada asignado a una instancia a través del constructor función no se puede heredar menos que la asigne al prototipo y sobrescribir de nuevo en el constructor de la función para que sea una propiedad de propiedad.
Cuando crea una nueva instancia a través de una función que se dobla como un constructor, en realidad sucede lo siguiente.
pseudo code:
copy Person.prototype as person
invoke Person function on person
return person
En realidad, esto es lo que sucede en todos los lenguajes clásicos cuando se crea una instancia de una clase. Pero la principal diferencia en JavaScript es que no está encapsulado dentro de una buena declaración de clase. Originalmente, JavaScript ni siquiera tenía constructores de funciones, pero se agregó más tarde porque SUN exigía que desearan que JavaScript se pareciese más a Java.
literales de objetos
La alternativa para los constructores de función para los objetos que llevan sólo los datos intrínsecos y no hay métodos son objetos literales.
var Mary = {
firstName: 'Mary',
lastName: 'Littlelamb'
};
Cuál es la forma preferida de declarar objetos intrínsecos en lugar de:
// do not ever do this!
var Mary = new Object();
Mary.firstName = 'Mary';
Mary.lastName = 'Littlelamb';
con literales de objetos en el conjunto de habilidades, puede crear un patrón de fábrica para los objetos de datos intrínsecos utilizando el module pattern (que es generalmente para singletons).
var createPerson = function(firstName, lastName){
return {
firstName: firstName,
lastName: lastName
}
}
var Mary = createPerson('Mary', 'Littlelamb');
Esto logra una encapsulación cómoda, pero solo se puede usar para objetos de datos intrínsecos.
Otra cosa que puedes hacer con los literales de objetos y JavaScript es la delegación, que debería ser la preferida.
var personMethods = {
speak: function(){
alert(this.firstName + ' says: "Hello world!"');
}
};
var Mary = {
firstName: "Mary",
lastName: "Littlelamb"
};
var Peter = {
firstName: "Peter",
lastName: "Crieswolf"
};
personMethods.speak.apply(Mary); // alerts 'Mary says: "Hello world!"'
personMethods.speak.apply(Peter); // alerts 'Peter says: "Hello world!"'
¿Por qué debería ser esto preferido?Debido a que mantiene sus objetos al minuto y legibles, incluso las referencias prototípicas ocupan memoria y al usar herencia y 'subclases' terminan con instancias hijo que tienen muchas referencias de métodos no utilizados. La delegación siempre es mejor.
Por qué la downvote? –
'Persona' no es una clase, no hay nada como una clase en JavaScript. JavaScript tiene objetos con 'herencia prototípica', pero' Persona' es simplemente un Objeto en este caso, ni siquiera tiene un método, es solo un HashMap/Diccionario como quieras llamarlo. Vea la respuesta de BGerissen a continuación para algunas buenas explicaciones. –
@ Ivo Se considera una clase cuando se habla en general. Y no, 'Person' anterior es una" función que se usa para crear instancias de objetos ", si quieres ser más específico. De nuevo, creo que podemos llamarlo una clase cuando hablamos en general, podemos seguir yendo más específico para siempre y terminar llamándolo ** ECMA Script Memory Pointer a un script para ser analizado (1) al ser llamado a través del paréntesis sintaxis. (1): Ejecutado en caso de nuevos compiladores de JavaScript. **. Entonces, el punto es que la respuesta anterior no pretende confundir y usar mal la terminología, sino explicar algo de una manera simple. – aularon