Está buscando el constructor
concepto.
Todas las funciones de JavaScript are objects y se pueden utilizar para crear objetos:
function make_person(firstname, lastname, age) {
person = {};
person.firstname = firstname;
person.lastname = lastname;
person.age = age;
return person;
}
make_person("Joe", "Smith", 23);
// {firstname: "Joe", lastname: "Smith", age: 23}
Sin embargo, con el fin de crear nuevos objetos de un tipo determinado (es decir, que heredan un prototipo, tener un constructor , etc.), una función puede hacer referencia a this
y si se llama con el operador new
y devolverá un objeto con todos los atributos definidos en this
en la función - this
en tales casos hace referencia al nuevo objeto que somos creando.
function make_person_object(firstname, lastname, age) {
this.firstname = firstname;
this.lastname = lastname;
this.age = age;
// Note, we did not include a return statement
}
La diferencia clave a tener en cuenta entre make_person
y make_person_object
es que llamar new make_person()
(en lugar de simplemente make_person()
) no va a hacer nada diferente ... tanto producirá el mismo objeto. Llamando make_person_object()
sin que el operador new
sin embargo, va a definir sus atributos en la this
this
objeto actual
este modo (generalmente window
si se está operando en el navegador.):
var Joe = make_person_object("Joe", "Smith", 23);
console.log(Joe); // undefined
console.log(window.firstname) // "Joe" (oops)
var John = new make_person_object("John", "Smith", 45);
console.log(John); // {firstname: "John", lastname: "Smith", age: 45}
Además, como señala @RobG , esta forma de hacer las cosas crea una referencia a la propiedad prototype
de make_person_object
en cada "Persona" que creamos. Esto nos permite añadir métodos y atributos a las personas después de los hechos:
Convención
// Assuming all that came before
make_person_object.prototype.full_name = "N/A";
make_person_object.prototype.greet = function(){
console.log("Hello! I'm", this.full_name, "Call me", this.firstname);
};
John.full_name // "N/A"
John.full_name = "John Smith";
make_person_object.full_name // Still "N/A"
John.greet(); // "Hello! I'm John Smith Call me John"
cuenta que las funciones constructoras como make_person_object
se capitalizan, singularizado y "nouned" (a falta de un término mejor) - por lo tanto que se tener un constructor Person
, en lugar de un make_person_object
que podría confundirse con una función normal.
Consulte también:
omitió la parte más importante: el nuevo objeto al que hace referencia el 'de este constructor' hereda propiedades del prototipo del constructor. – RobG
@RobG - ¡bien que yo * lo hice *! He actualizado la respuesta para incluir algunos ejemplos de esto. ¡Gracias por ayudar a mejorarlo! –
Fantástica respuesta. Verdaderamente genial. Cubrí qué hacer y luego me enseñó a comprenderlo. Cada pregunta que tuve leyendo fue respondida en la siguiente sección después. ¡¡Gracias!! – redfox05