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).
Só um pontinho. Nada a discordar, mas acrescentar. Quando crio uma extension method, eu sempre procuro adicionar ao global.using, então não está errado, porém acho que é de bom tom, quando vocêr quer algo que tenha comportamento nativo do Tipo(acho que entendeu), ser importado globalmente.
Quanto a prototype, não tenho muito mais informação a agregar pois conheço pouco, apenas para o que utilizei e por isso também que senti uma similaridade no comportamento que queria ter em js, que tenho em C#.
Obrigado, por agregar ao post!