Extension Methods em C# e Prototypes em JavaScript: Olha essa similaridade INCRÍVEL!
Bora falar sobre uma técnica poderosa (acho que nem tanto, mas é legal) de programação? Hoje o assunto é Extension Methods no C# e Prototypes no JavaScript.
Extension Methods em C#
No C#, os Extension Methods permitem adicionar métodos a tipos já existentes sem alterar o código original. Olha este exemplo:
var text = "C# Extension methods";
text.log();
public static class InjectString {
public static void log(this string content) {
Console.WriteLine(content);
}
}
Se quiser testar: dotnetfiddle.net
Aqui, log()
vira um método de string, sem precisar alterar a classe string
. Isso funciona para quase qualquer tipo (bem, dynamic não!)
Prototypes em JavaScript
Já no JavaScript, podemos usar Prototypes para fazer algo parecido. Olha pra tu vê 😁:
String.prototype.log = function() {
console.log(this.valueOf());
}
var text = "JavaScript Extension methods";
text.log();
Se quiser testar: playcode.io
Agora, qualquer string também tem o método log(). 🔥
E no TypeScript? 🤔
No TypeScript, usar Prototypes é meio merda, porque você vai ter que abrir mão de tipagem, e muitas vezes vai ser preciso lançar um as any
. Então, não é tão direto como no C#, mas é possível.
Resumo Final
- C#: Flexível e seguro — funciona para quase qualquer tipo, exceto dynamic.
- JavaScript: Prototypes são poderosos, mas em TypeScript, exigem um pouco de "gambiarra" (a de lei né pai 😁).
Esse é um post beeem melhor construído, de um post que fiz no linkedin, mas caso queira, pode acomapnha-lo aqui: Linkedin: Extension Methods e Prototype
Abaixo se quiser (só se quiser!) me apoiar, meu projeto precisa desse alcance pra quando for lançado. Então vou deixar abaixo minhas redes, obrigado! 😁
Caso queira acompanhar o projeto Dicionário do bebê - Implementando API do Stripe em V Caso queira saber sobre o WebHulkTest (Hulk esmaga!!) WebHulkTest Abaixo as minhas redes, se quiser ver eu postando algo mais... E eu não tenho nenhuma experiência com isso.
Linkedin: André Luiz Youtube: @Ddiidev Github: @Ddiidev X: @luizdidev
Extension Method:
- É syntax sugar para um método estático
- É algo isolado do objeto
- Não tem acesso ao objeto todo
- Só é acessível se ele estiver em um namespace que está importado
- Não participa de herança
- É garantido em tempo de compilação
Prototype:
- É syntax sugar para um método normal, como são todos os métodos de JS
- Passa fazer parte do objeto
- Acessa todo o objeto
- Ele é carregado em toda a vida do objeto
- Objetos filhos deste também terão o método novo
- Pode dar erro achando que ele está presente mas não está
Então é similiar, mas completamente diferente.
Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente (não vendo nada, é retribuição na minha aposentadoria) (links aqui no perfil também).
No C# eu uso porque é muito util. Você modificar uma classe sem precisar mexer no seu código é realmente poderoso. Já no JS não sabia que o protoype era semelhante. Aqui no Tabnews sempre aprendemos algo.
Extension methods é uma funcionalidade bem legal mesmo. Apesar de eu não usar C#, já tirei proveito disso em Kotlin.
Em TypeScript, para adicionar propriedades ao prototype de algum objeto global sem abrir mão da tipagem, vc pode usar uma interface. Por exemplo:
interface String {
log(): void;
}
String.prototype.log = function () {
console.log(this);
};
const text = "JavaScript Extension methods";
text.log();
O ideal é mover a declaração da interface para um arquivo *.d.ts
para que a definição esteja disponível em qualquer módulo.
Não são realmente conceitos equivalente, para além da descrição superficial de "estenderem um objeto".
Extensions em C# é uma feature de linguagem que funciona no nivel real de tipos, o compilador detecta que você fez algo como something.ExtensionMethod()
e transforma isso no equivalente funcional StaticClass.ExtensionMethod(something)
.
Em JS não existem tipos no sentido concreto da palavra, a linguagem tem o conceito de prototypes pra permitir o compartilhamento de comportamentos entre objetos com raízes em comum, mas não passa disso. Você pode inclusive fazer coisas assim:
const prot = { click() { console.log('clicked') } };
const something = {};
something.click(); // erro
something.__PROTO__ = prot;
something.click(); // 'clicked'
Então está muito mais próximo de uma ideia de "herança" em OOP do que do que seriam os extension methods. Em C# você pode usar o type system ao máximo do potencial dele com as extensions, inclusive pra fazer coisas completamente genéricas como:
public static void PrintTypeName<T>(this T self)
=> Console.WriteLine($"Type name is {typeof(T).Name}");
"something".PrintTypeName();
Belo post! Uso muito Extension Methods no C#, as vezes até demais, mas é uma mão na roda incrível!