Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

250
Visualizações
¿Cómo puedo obtener todos los métodos de los ancestros en JS (herencia prototípica)?

Necesito crear una función en JS que obtenga todos los métodos de todo el árbol de herencia para insertar un <button> para cada método. tengo este codigo

 function A () { } A.prototype.a = function () { console.log('a'); } function B () { this.super = A; this.super(); } B.prototype = new A; B.prototype.constructor = B; B.prototype.b = function () { console.log('b'); } function C () { this.super = B; this.super(); } C.prototype = new B; C.prototype.constructor = C; C.prototype.c = function () { console.log('c'); } function D () { } D.prototype = C; D.prototype.constructor = D; D.prototype.d = function () { console.log('d'); } const dd = new D();

Necesito alguna forma de encontrar los métodos de todo el árbol en caso de que no sepa cuántos ancestros tiene un objeto. Por ejemplo: si un objeto C tiene a A y B como ancestros, necesito los métodos de A, B y C; Si un objeto D fuera un hijo de ABC, necesito los métodos de los cuatro (A, B, C y D). Es posible que pueda rastrear a mano cada método para escribir un código que haga eso por mí, pero necesito que sea dinámico.

Esto es lo que estoy usando:

 console.log(Object.getOwnPropertyNames(dd.__proto__).filter(function (property) { return ( typeof dd.__proto__[property] === 'function' && property !== 'constructor' ); }))
about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Hay un error en su código de configuración:

Cambio:

 D.prototype = C;

a:

 D.prototype = new C;

Luego, para obtener la lista de métodos (incluso cuando no se pueden enumerar), realice una llamada recursiva. Incluso puedes convertirlo en un generador.

Para aclarar de dónde provienen los métodos, les prefijé el nombre del objeto prototipo (como A.prototype ). Verá que cuando existen funciones con el mismo nombre en varios niveles de la cadena de prototipos, cada una aparece en la lista:

 function * iterMethods(o) { if (!o || o === Object.prototype) return; for (let name of Object.getOwnPropertyNames(o)) { try { if (name !== "constructor" && typeof o[name] === "function") { yield o.constructor.name + ".prototype." + name; } } catch {} } yield * iterMethods(Object.getPrototypeOf(o)); } // Your code: function A () { } A.prototype.a = function () { console.log('a'); } function B () { this.super = A; this.super(); } B.prototype = new A; B.prototype.constructor = B; B.prototype.b = function () { console.log('b'); } function C () { this.super = B; this.super(); } C.prototype = new B; C.prototype.constructor = C; C.prototype.c = function () { console.log('c'); } function D () { } D.prototype = new C; D.prototype.constructor = D; D.prototype.d = function () { console.log('d'); } const dd = new D(); // The call: console.log(Array.from(iterMethods(Object.getPrototypeOf(dd))));

Es más fácil configurar esta jerarquía prototípica cuando usa la sintaxis class ... extends . Tampoco definiría super ya que es una palabra clave que está disponible de forma nativa. Así es como se vería:

 function * iterMethods(o) { if (!o || o === Object.prototype) return; for (let name of Object.getOwnPropertyNames(o)) { try { if (name !== "constructor" && typeof o[name] === "function") { yield o.constructor.name + ".prototype." + name; } } catch {} } yield * iterMethods(Object.getPrototypeOf(o)); } // class syntax version: class A { a() { console.log('a'); } } class B extends A { b() { console.log('b'); } } class C extends B { c() { console.log('c'); } } class D extends C { d() { console.log('d'); } } const dd = new D(); // The call: console.log(Array.from(iterMethods(Object.getPrototypeOf(dd))));

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda