Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

97
Vistas
Herencia de objetos con una propiedad knockout

Tengo el siguiente ejemplo de herencia js:

 function Fruit(){ this.who = function(){ console.dir(this.fruitName); } } Fruit.prototype.fruitName = "I am a fruit"; function Orange(){ Fruit.call(); this.fruitName = "I am an orange"; } Orange.prototype = new Fruit(); Orange.prototype.constructor = Orange; function Apple(){ Fruit.call(); this.fruitName = "I am an apple"; } Apple.prototype = new Fruit(); Apple.prototype.constructor = Orange; var orange = new Orange(); var apple = new Apple(); orange.who(); apple.who();

El código anterior genera:

 I am an orange I am an apple

Cual es correcta.

Ahora, cambiar fruitName a un observable knockout da un resultado inesperado:

 function Fruit(){ this.who = function(){ console.dir(this.fruitName()); } } Fruit.prototype.fruitName = ko.observable("I am a fruit"); function Orange(){ Fruit.call(); this.fruitName("I am an orange"); } Orange.prototype = new Fruit(); Orange.prototype.constructor = Orange; function Apple(){ Fruit.call(); this.fruitName("I am an apple"); } Apple.prototype = new Fruit(); Apple.prototype.constructor = Orange; var orange = new Orange(); var apple = new Apple(); orange.who(); apple.who();

Producción:

 I am an apple I am an apple

A menos que esté haciendo algo mal, esto parece un error en Knockout. ¿Hay alguna forma de solucionar este problema?

Jsfiddle completo disponible aquí: https://jsfiddle.net/h1go9se2/

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Que esta pasando

La idea del prototipo es que se comparte entre instancias. Las funciones usan this para asegurarse de que la ejecución de los métodos realmente impacte en una sola instancia.

Los observables knockout son funciones, pero es mejor pensar en ellos como envoltorios alrededor de un valor.

Si define su observable en el prototipo, significa que está envolviendo un valor para ser compartido por todas las instancias.

Escribir en ese valor en el constructor de cualquier clase que lo amplíe sobrescribirá el valor para todas las instancias.

La solución

En lugar de declarar fruitName en el prototipo de Fruit , define la propiedad dentro del constructor de Fruit :

 function Fruit(){ this.who = function(){ console.dir(this.fruitName()); } this.fruitName = ko.observable("I am a fruit"); }

Fragmento ejecutable:

 function Fruit(){ this.who = function(){ console.dir(this.fruitName()); } this.fruitName = ko.observable("I am a fruit"); } function Orange(){ Fruit.call(); this.fruitName("I am an orange"); } Orange.prototype = new Fruit(); Orange.prototype.constructor = Orange; function Apple(){ Fruit.call(); this.fruitName("I am an apple"); } Apple.prototype = new Fruit(); Apple.prototype.constructor = Orange; var orange = new Orange(); var apple = new Apple(); orange.who(); apple.who();
 <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda