Skip to content

Prototipos

Introducción

Los prototipos son un mecanismo que nos permite agregar propiedades y métodos a los objetos. Todos los objetos en JavaScript tienen un prototipo, y los prototipos son objetos también.

¿Qué es un prototipo?

Un prototipo es un objeto que tiene propiedades y métodos, y que puede ser usado como plantilla para crear otros objetos.

¿Para qué sirven los prototipos?

Los prototipos nos permiten agregar propiedades y métodos a los objetos, y que estos sean heredados por los objetos que se creen a partir de ellos.

Es un mecanismo similar a la herencia en otros lenguajes de programación.

Ejemplo de prototipo

javascript
const persona = {
  nombre: "Juan",
  apellido: "Perez",
  nombreCompleto: function() {
    return `${this.nombre} ${this.apellido}`
  }
}

console.log(persona.nombreCompleto())
const persona = {
  nombre: "Juan",
  apellido: "Perez",
  nombreCompleto: function() {
    return `${this.nombre} ${this.apellido}`
  }
}

console.log(persona.nombreCompleto())

Ejemplo de prototipo con constructor

javascript
function Persona(nombre, apellido) {
  this.nombre = nombre
  this.apellido = apellido
}

Persona.prototype.nombreCompleto = function() {
  return `${this.nombre} ${this.apellido}`
}

const persona = new Persona("Juan", "Perez")

console.log(persona.nombreCompleto())
function Persona(nombre, apellido) {
  this.nombre = nombre
  this.apellido = apellido
}

Persona.prototype.nombreCompleto = function() {
  return `${this.nombre} ${this.apellido}`
}

const persona = new Persona("Juan", "Perez")

console.log(persona.nombreCompleto())

En este caso, nuestro prototipo es la función Persona, y los objetos que creemos a partir de ella van a heredar las propiedades y métodos que definamos en su prototipo.

Los prototipos son la forma en la que JavaScript implementa la herencia, gracias a ellos podemos acceder a las propiedades y métodos de un objeto desde otro objeto.

javascript
const nombre = "Juan"
console.log(nombre.toUpperCase())
const nombre = "Juan"
console.log(nombre.toUpperCase())

En este caso, el prototipo de nombre es String, y por eso podemos acceder a sus métodos.

javascript
console.log(String.prototype)
console.log(String.prototype)

Esto nos va a mostrar el prototipo de String, que es un objeto con todos los métodos que podemos usar en un string.

Ejemplo de prototipo con clase

javascript
class Persona {
  constructor(nombre, apellido) {
    this.nombre = nombre
    this.apellido = apellido
  }

  nombreCompleto() {
    return `${this.nombre} ${this.apellido}`
  }
}

const persona = new Persona("Juan", "Perez")

console.log(persona.nombreCompleto())
class Persona {
  constructor(nombre, apellido) {
    this.nombre = nombre
    this.apellido = apellido
  }

  nombreCompleto() {
    return `${this.nombre} ${this.apellido}`
  }
}

const persona = new Persona("Juan", "Perez")

console.log(persona.nombreCompleto())

En este caso, nuestro prototipo es la clase Persona, y los objetos que creemos a partir de ella van a heredar las propiedades y métodos que definamos en su prototipo.

Si! Las clases son prototipos, aunque muchos lenguajes de programación orientados a objetos no lo implementen de esta forma, en JavaScript las clases son prototipos.

Ejemplo de prototipo con clase y herencia

javascript
class Persona {
  constructor(nombre, apellido) {
    this.nombre = nombre
    this.apellido = apellido
  }

  nombreCompleto() {
    return `${this.nombre} ${this.apellido}`
  }
}

class Empleado extends Persona {
  constructor(nombre, apellido, sueldo) {
    super(nombre, apellido)
    this.sueldo = sueldo
  }

  nombreCompleto() {
    return `${super.nombreCompleto()} - ${this.sueldo}`
  }
}

const empleado = new Empleado("Juan", "Perez", 1000)

console.log(empleado.nombreCompleto())
class Persona {
  constructor(nombre, apellido) {
    this.nombre = nombre
    this.apellido = apellido
  }

  nombreCompleto() {
    return `${this.nombre} ${this.apellido}`
  }
}

class Empleado extends Persona {
  constructor(nombre, apellido, sueldo) {
    super(nombre, apellido)
    this.sueldo = sueldo
  }

  nombreCompleto() {
    return `${super.nombreCompleto()} - ${this.sueldo}`
  }
}

const empleado = new Empleado("Juan", "Perez", 1000)

console.log(empleado.nombreCompleto())