O Prototype Design Pattern em JavaScript é um padrão de criação que permite criar novos objetos clonando um objeto existente (o "protótipo") em vez de criá-los do zero, o que serve como um protótipo. Esse padrão é particularmente adequado para JavaScript, pois o próprio JavaScript é uma linguagem baseada em protótipo e é útil quando a criação de objetos é cara ou quando você deseja criar um objeto que compartilhe certas propriedades com um protótipo base.
As classesES6 facilitam a compreensão da estrutura dos objetos. O uso de extensões simplifica a herança, mas antes do ES6, o protótipo era usado para herdar e implementar isso. Aqui está o blog para entender esse conceito.
Ps: No Prototype Design Pattern em JavaScript, não existe um método clone() integrado como existe em algumas outras linguagens (por exemplo, Java). No entanto, você pode implementar manualmente um método clone() em seu protótipo ou função construtora para fornecer funcionalidade semelhante.
A ideia por trás do padrão Prototype é:
Protótipo: um objeto modelo a partir do qual novos objetos são criados.
Clonagem: Novos objetos são criados copiando o protótipo.
Cadeia de protótipos: objetos podem delegar comportamento ao seu protótipo
class Shape { constructor(type = 'Generic Shape', color = 'White') { this.type = type; this.color = color; } getDetails() { return `Type: ${this.type}, Color: ${this.color}`; } // Clone method to create a new object with the same prototype clone() { return Object.create(this); // Creates a new object that inherits from this prototype } }
Explicação:
Propósito: A classe Shape atua como uma classe base ou "protótipo" da qual formas específicas como círculos ou retângulos podem herdar.
Métodoclone(): Esta é uma parte fundamental do Padrão de Protótipo. Em vez de criar uma nova instância de uma classe do zero, criamos um clone da instância existente (ou "protótipo"). Neste caso, Object.create(this) cria um novo objeto que compartilha o mesmo protótipo do Shape original.
class Circle extends Shape { constructor(radius = 0, color = 'White') { super('Circle', color); // Calls the parent (Shape) constructor this.radius = radius; } getArea() { return Math.PI * this.radius * this.radius; } }
Explicação:
Objetivo: A classe Circle estende a classe Shape e representa um tipo específico de forma.
Atributos:
getArea(): Calcula a área do círculo usando a fórmula π * raio ^ 2.
class Rectangle extends Shape { constructor(width = 0, height = 0, color = 'White') { super('Rectangle', color); // Calls the parent (Shape) constructor this.width = width; this.height = height; } getArea() { return this.width * this.height; } }
Explicação:
Purpose: A classe Rectangle estende a classe Shape e representa outro tipo específico de forma (um retângulo).
const circlePrototype = new Circle(); // Create prototype const myCircle = circlePrototype.clone(); // Clone the prototype myCircle.radius = 5; myCircle.color = 'Red'; const rectanglePrototype = new Rectangle(); // Create prototype const myRectangle = rectanglePrototype.clone(); // Clone the prototype myRectangle.width = 10; myRectangle.height = 5; myRectangle.color = 'Blue';
Explicação:
Aqui, em vez de criar objetos myCircle e myRectangle do zero usando a palavra-chave new, estamos clonando protótipos.
Processo de clonagem:
Modificando instâncias clonadas:
console.log(myCircle.getDetails()); // Output: Type: Circle, Color: Red console.log(`Circle Area: ${myCircle.getArea()}`); // Output: Circle Area: 78.54 console.log(myRectangle.getDetails()); // Output: Type: Rectangle, Color: Blue console.log(`Rectangle Area: ${myRectangle.getArea()}`); // Output: Rectangle Area: 50
Explicação:
O padrão Prototype é útil quando:
Se você chegou até aqui ?✨, deixe um comentário abaixo com qualquer dúvida ou opinião. Eu adoraria ouvir sua opinião e participar de ótimas discussões!✨
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3