CursosEmpresasBlogLiveConfPrecios

Contenido del curso

¡Salva al Capitán DC!

  • 1
    JavaScript POO para rescate espacial

    JavaScript POO para rescate espacial

    00:50 min
  • 2
    Recupera el Sistema de Comunicaciones

    Recupera el Sistema de Comunicaciones

    00:01 min
  • 3
    Vulnerabilidades del Sistema de Navegación

    Vulnerabilidades del Sistema de Navegación

    Viendo ahora
  • 4
    Historial de Cambios en el Motor

    Historial de Cambios en el Motor

    00:20 min
  • 5
    Aprendizado contínuo em cibersegurança

    Aprendizado contínuo em cibersegurança

    00:36 min
Tomar examen

Vulnerabilidades del Sistema de Navegación

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads

      Comentarios15

      Bramucci Candela

      Bramucci Candela

      Estudiante
      Hace 3 años
        Juan Castro

        Juan Castro

        Profesor
        Hace 3 años
        Bramucci Candela

        Bramucci Candela

        Estudiante
        Hace 3 años
      Juan Castro

      Juan Castro

      Profesor
      Hace 3 años
      Miguel Ángel Torres Vargas

      Miguel Ángel Torres Vargas

      Estudiante
      Hace 3 años
        Juan Castro

        Juan Castro

        Profesor
        Hace 3 años
        CRISTIAN DARIO AGUDELO PORRAS

        CRISTIAN DARIO AGUDELO PORRAS

        Estudiante
        Hace 3 años
      Andre Huaman Yovera

      Andre Huaman Yovera

      Estudiante
      Hace 3 años
        Dayane Coronado Guzmán

        Dayane Coronado Guzmán

        Estudiante
        Hace 3 años
      Francisco Arturo Leon Velasco

      Francisco Arturo Leon Velasco

      Estudiante
      Hace 3 años
      Andrés Schuster

      Andrés Schuster

      Estudiante
      Hace 3 años
      luis carlos rojano vergara

      luis carlos rojano vergara

      Estudiante
      Hace 3 años
      Jorge Méndez Ortega

      Jorge Méndez Ortega

      Estudiante
      Hace 3 años
      Paula Inés Cudicio

      Paula Inés Cudicio

      Estudiante
      Hace 3 años
        Juan Castro

        Juan Castro

        Profesor
        Hace 3 años
        Paula Inés Cudicio

        Paula Inés Cudicio

        Estudiante
        Hace 3 años
      Harold Zurita Simon

      Harold Zurita Simon

      Estudiante
      Hace 3 años
      Daniel Carmona

      Daniel Carmona

      Estudiante
      Hace 3 años
      Jacobo Burbano

      Jacobo Burbano

      Estudiante
      Hace 3 años
      Mauricio Carrasco

      Mauricio Carrasco

      Estudiante
      Hace 3 años
      Frandel Corporan Rodríguez

      Frandel Corporan Rodríguez

      Estudiante
      Hace 3 años
      Octavio Villavicencio Cruz

      Octavio Villavicencio Cruz

      Estudiante
      Hace 3 años

      El dolor que sentí al no poder usar private fields :,)

      X2, esa iba a ser la solución oficial original Muy pronto podremos!!

      :eyes:

      Clases que pueden ayudarte a solucionar este desafío:

      • Lo más nuevo en JavaScript Orientado a Objetos
      • Module Pattern y Namespaces: propiedades privadas en JavaScript

      Me dolio la cabeza pero hice 3 soluciones, la cual una de ellas me deja pensando en el proceso:

      1. Segun los recursos podiamos encapsular este proceso utilizando sea atributos privados dentro de la clase, pero si usamos #_spaceShipKey; y los llamamos respectivamente this.#_spaceShipKey; Funciona PERO no funciona en el simulador de platzi, ya que desactivaron estas reglas.
      export function simulador(astronaut, spaceShip, direction) { astronaut.navigate(spaceShip, direction); return spaceShip._movements; } export class Astronaut { // Private #_spaceShipKey; constructor({ name }) { this.name = name; } setAccessKey(accessKey) { this.#_spaceShipKey = accessKey; } navigate(spaceShip, direction) { spaceShip.navigator(direction, { accessKey: this.#_spaceShipKey }); } } export class SpaceShip { // Private #_key; constructor({ key }) { this.#_key = key; this._movements = []; } getAccessKey(astronaut) { const isAstronaut = astronaut instanceof Astronaut; if (isAstronaut) { astronaut.setAccessKey(this.#_key); } } navigator(direction, { accessKey }) { if (this.#_key == accessKey) { this._movements.push(direction) } else { this._movements.push("Incorrect Access Key"); } } }
      1. Utilizando ya algo un poco mas avanzado, similar a la solucion del problema, se reduce la clase a propios objetos privados con narrow function properties:
      export class Astronaut { constructor({ name }) { this.name = name; let _spaceShipKey; this.setAccessKey = (accessKey) => _spaceShipKey = accessKey; this.getAccessKey = () => _spaceShipKey; } navigate(spaceShip, direction) { spaceShip.navigator(direction, this); } } export class SpaceShip { constructor({ key }) { this._key = key; this._movements = []; } getAccessKey(astronaut) { if (astronaut instanceof Astronaut) { astronaut.setAccessKey(this._key); } } navigator(direction, astronaut) { if (astronaut instanceof Astronaut && this._key === astronaut.getAccessKey()) { this._movements.push(direction) } else { this._movements.push("Incorrect Access Key"); } } } export function simulador(astronaut, spaceShip, direction) { astronaut.navigate(spaceShip, direction); return spaceShip._movements; }
      1. Utilizando Object.defineProperty como se menciona en el rescurso de los comentarios se llega a definir la clase y sus atributos de una manera privada para que no se lea su contendio sino que se defina solo cuando es necesario
      export class Astronaut { constructor({ name }) { this.name = name; this._spaceShipKey; Object.defineProperty(this, '_spaceShipKey', { value: undefined, writable: false, enumerable: false, configurable: false }); } setAccessKey(accessKey) { this._spaceShipKey = accessKey; } navigate(spaceShip, direction) { spaceShip.navigator(direction, this); } } export class SpaceShip { constructor({ key }) { Object.defineProperty(this, '_key', { value: key, writable: false, enumerable: false, configurable: false }); this._movements = []; } getAccessKey(astronaut) { if (astronaut instanceof Astronaut) { astronaut.setAccessKey(this._key); } } navigator(direction, astronaut) { if (astronaut instanceof Astronaut && this._key === astronaut._spaceShipKey) { this._movements.push(direction) } else { this._movements.push("Incorrect Access Key"); } } } export function simulador(astronaut, spaceShip, direction) { astronaut.navigate(spaceShip, direction); return spaceShip._movements; }

      Pero (Y aqui viene la pregunta), Veo que si se define en el constructor o en el metodo el Object.defineProperty no aplicara en la gran mayoria de casos su funcion y hay que sacarlo para medio "hackiar", el proceso, pero aun asi siguien siendo largo el proceso, algo similar a:

      ... ... export function simulador(astronaut, spaceShip, direction) { astronaut.navigate(spaceShip, direction); return spaceShip._movements; } Object.defineProperty(Astronaut.prototype, "_spaceShipKey", { writable: false, configurable: false, enumerable: false, value: undefined, }); Object.defineProperty(Astronaut.prototype, "setAccessKey", { writable: false, configurable: false, enumerable: false, value: function (accessKey) { Object.defineProperty(this, "_spaceShipKey", { writable: true, configurable: false, enumerable: false, value: accessKey, }); }, });

      pero no aplica para key ya que adentro es diferente su funcion.

      La pregunta despues de todo es:

      Como usar Object.defineProperty para que funcione en todos los casos.

      Igual (si llega a funcionar con Object.defineProperty, en platzi me deja el ultimo (Capitán Impostor) con la informacion correcta como si las pruebas no fueran unitarias de todo si no en conjunto), vease esto presionando varias veces los botones en Vista.

      Gracias por su tiempo y disculpen la extensión del post.

      Las 3 soluciones que propones están excelentes. Exactamente así imaginamos el código con el que se resolvería el problema.

      • En efecto, los private fields son muy divertidos y cómodos de usar, aunque todavía no tengan buen soporte.

      • Programar todo desde el constructor para trabajar con variables locales funciona, aunque todo el código quede un poco "apeñuscado".

      • Y defineProperty definitivamente es lo más parecido que tenemos a hackear JavaScript para evitar completamente el acceso y modificación a nuestras propiedades, aunque llega incluso a ser demasiada protección, a veces no es tan conveniente.

      Gracias por el aporte, ya que en el curso no se explico el uso del __ # __ para definir la privacidad usando la sintaxis de class , ya que intentando con .defineProperty y con get&set no me fue posible dar solucion al problema!!

      Para solucionar el problema de seguridad en la navegación de la nave espacial, debes abordar las vulnerabilidades identificadas. En el código proporcionado, hay dos vulnerabilidades principales: .

      1. Clonación de la llave de acceso desde la propiedad _spaceShipKey del Capitán DC.
      2. Clonación de la llave de acceso desde la propiedad _key de la nave espacial.

      . Para abordar la primera vulnerabilidad, debes asegurarte de que la propiedad _spaceShipKey del Capitán DC no sea accesible para otros astronautas. Puedes lograrlo haciendo la siguiente modificación en el código:

      export class Astronaut { constructor({ name }) { this.name = name; this._spaceShipKey = undefined; } setAccessKey(accessKey) { if (!this._spaceShipKey) { // Agrega esta verificación para evitar reemplazar la llave existente this._spaceShipKey = accessKey; } } navigate(spaceShip, direction) { spaceShip.navigator(direction, { accessKey: this._spaceShipKey }); } }

      Con esta modificación, el Capitán DC solo puede establecer su llave de acceso una vez. Si se intenta establecer nuevamente, se ignorará la nueva llave. . Para abordar la segunda vulnerabilidad, debes asegurarte de que no se pueda acceder ni modificar directamente la propiedad _key de la nave espacial. Puedes lograrlo mediante el uso de una técnica llamada "encapsulación" o "protección de acceso" en JavaScript. Modifica el constructor de la clase SpaceShip y define una función getKey() para acceder a la llave:

      export class SpaceShip { constructor({ key }) { let _key = key; // Utiliza una variable local para almacenar la llave this.getKey = () => { return _key; }; this._movements = []; } getAccessKey(astronaut) { const isAstronaut = astronaut instanceof Astronaut; if (isAstronaut) { astronaut.setAccessKey(this.getKey()); } } navigator(direction, { accessKey }) { if (this.getKey() === accessKey) { this._movements.push(direction); } else { this._movements.push("Incorrect Access Key"); } } }

      Con esta modificación, la propiedad _key de la nave espacial se vuelve inaccesible directamente desde fuera de la clase, y solo se puede obtener a través de la función getKey(). Esto evita la clonación no autorizada de la llave de acceso. . Una vez realizadas estas modificaciones, el código debería ser más seguro y las vulnerabilidades identificadas estarán mitigadas.

      Gracias por tu información me ayudo a entender mejor como solucionar la segunda vulnerabilidad del ejercicio. Excelente explicación para tu solución.

      function simulador(astronaut, spaceShip, direction) { astronaut.navigate(spaceShip, direction); return spaceShip._movements; } class Astronaut { #_spaceShipKey constructor({ name }) { this.name = name; this.#_spaceShipKey = undefined; } setAccessKey(accessKey) { this.#_spaceShipKey = accessKey; } navigate(spaceShip, direction) { spaceShip.navigator(direction, { accessKey: this.#_spaceShipKey }); } } class SpaceShip { #_key constructor({ key }) { this.#_key = key; this._movements = []; } getAccessKey(astronaut) { const isAstronaut = astronaut instanceof Astronaut; if (isAstronaut) { astronaut.setAccessKey(this.#_key); } } navigator(direction, { accessKey }) { if (this.#_key == accessKey) { this._movements.push(direction) } else { this._movements.push("Incorrect Access Key"); } } }
      export function simulador(astronaut, spaceShip, direction) { astronaut.navigate(spaceShip, direction); return spaceShip.movements; } export class Astronaut { constructor({ name }) { this.name = name; this._spaceShipKey = undefined; } set spaceShipKey(key) { if (this._spaceShipKey === undefined) { this._spaceShipKey = key; } } navigate(spaceShip, direction) { spaceShip.navigator(direction, { astronaut: this }); } } export class SpaceShip { constructor({ key }) { this._key = key; this._movements = []; this._astronauts = []; } get movements() { return this._movements; } get astronauts() { return this._astronauts; } addAstronaut(astronaut) { const isAstronaut = astronaut instanceof Astronaut; if (isAstronaut) { this._astronauts.push(astronaut); } } getAccessKey(astronaut) { const isAstronaut = astronaut instanceof Astronaut; if (isAstronaut) { astronaut.spaceShipKey = this._key; this.addAstronaut(astronaut); // Agregar astronauta a la lista de astronautas a bordo de la nave } } navigator(direction, { astronaut }) { const isAstronautAccessKeyValid = this._astronautAccessKeyValid(astronaut); if (isAstronautAccessKeyValid) { this._movements.push(direction); } else { this._movements.push("Incorrect Access Key"); } } _astronautAccessKeyValid(astronaut) { return this._astronauts.some(a => a === astronaut && a._spaceShipKey === this._key); } }

      Propuesta aprovechando el closure en el constructor.

      export function simulador(astronaut, spaceShip, direction) { astronaut.navigate(spaceShip, direction); return spaceShip._movements; } export class Astronaut { constructor({ name }) { this.name = name; let _spaceShipKey = undefined; this.setAccessKey = function (accessKey) { _spaceShipKey = accessKey; } this.navigate = function(spaceShip, direction) { spaceShip.navigator(direction, { accessKey: _spaceShipKey }); } } } export class SpaceShip { constructor({ key }) { let _key = key; this._movements = []; this.getAccessKey = function(astronaut) { const isAstronaut = astronaut instanceof Astronaut; if (isAstronaut) { astronaut.setAccessKey(_key); } } this.navigator = function (direction, { accessKey }) { if (_key == accessKey) { this._movements.push(direction) } else { this._movements.push("Incorrect Access Key"); } } } }

      genial interesante, pero el capitán podrá mantener el rumbo

      Ya esta!! y ahora?? jajaja no me deja seguir a la siguiente clase, es normal? lo van cargando de a poco??

      Muy buena modalidad! me encantó!

      Puedes entrar a esta clase, Paula...? https://platzi.com/clases/5943-secretos-javascript/58541-estabilicemos-el-motor/

      Gracias!!!

      Solución 😄..

      . . . .

      export function simulador(astronaut, spaceShip, direction) { astronaut.navigate(spaceShip, direction); return spaceShip._movements; } export class Astronaut { constructor({ name }) { this.name = name; this.private = { _spaceShipKey: undefined }; } setAccessKey(accessKey) { this.private["_spaceShipKey"] = accessKey; } navigate(spaceShip, direction) { spaceShip.navigator(direction, { accessKey: this.private["_spaceShipKey"] }); } } export class SpaceShip { constructor({ key }) { this.private = { _key: key }; this._movements = []; } getAccessKey(astronaut) { const isAstronaut = astronaut instanceof Astronaut; if (isAstronaut) { astronaut.setAccessKey(this.private["_key"]); } } navigator(direction, { accessKey }) { if (this.private["_key"] == accessKey) { this._movements.push(direction) } else { this._movements.push("Incorrect Access Key"); } } }

      Estan buenos estos ejercicios!

      Usando el método estático defineProperty

      export class Astronaut { constructor({ name }) { this.name = name; let _spaceShipKey = undefined; Object.defineProperty(this, 'accessKey', { get(){return _spaceShipKey}, set (accessKey){_spaceShipKey = accessKey} }) } navigate(spaceShip, direction) { spaceShip.navigator(direction, {accessKey : this.accessKey}); } }

      Solución con namespaces:

      export function simulador(astronaut, spaceShip, direction) { astronaut.navigate(spaceShip, direction); return spaceShip._movements; } export class Astronaut { constructor({ name }) { this.name = name; // this._spaceShipKey = undefined; this.private = { _spaceShipKey: undefined }; } setAccessKey(accessKey) { this.private["_spaceShipKey"] = accessKey; } navigate(spaceShip, direction) { spaceShip.navigator(direction, { accessKey: this.private["_spaceShipKey"], }); } } export class SpaceShip { constructor({ key }) { this.private = { _key: key, _movements: [], }; } getAccessKey(astronaut) { const isAstronaut = astronaut instanceof Astronaut; if (isAstronaut) { astronaut.setAccessKey(this.private["_key"]); } } get _movements() { return this.private["_movements"]; } navigator(direction, { accessKey }) { if (this.private["_key"] == accessKey) { this.private["_movements"].push(direction); } else { this.private["_movements"].push("Incorrect Access Key"); } } }

      Sistema de navegacion arreglado ahora a culpar a capitan DC porque el es el impostor jajaja

      export function simulador(astronaut, spaceShip, direction) { astronaut.navigate(spaceShip, direction); return spaceShip._movements; } export class Astronaut { constructor({ name }) { this.name = name; this.private = { _spaceShipKey: undefined } } setAccessKey(accessKey) { this.private["_spaceShipKey"] = accessKey; } navigate(spaceShip, direction) { spaceShip.navigator(direction, { accessKey: this.private["_spaceShipKey"] }); } } export class SpaceShip { constructor({ key }) { this.private={ _key: key } this._movements = []; } getAccessKey(astronaut) { const isAstronaut = astronaut instanceof Astronaut; if (isAstronaut) { astronaut.setAccessKey(this.private["_key"]); } } navigator(direction, { accessKey }) { if (this.private["_key"] == accessKey) { this._movements.push(direction) } else { this._movements.push("Incorrect Access Key"); } } }

      el poder de un gato "#"