Tengo un módulo requirejs que uso como fábrica para crear objetos de diferentes tipos, la fábrica se ilustra a continuación:
requirejs.config({ appDir: ".", baseUrl: "js", paths: { 'jquery': '//cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min', 'knockout': 'https://cdnjs.cloudflare.com/ajax/libs/knockout/3.5.1/knockout-latest.min' }, 'knockout': { deps: ['jquery'],exports: 'knockout' } }); define("FruitFactory", ["knockout"], function(ko){ function Fruit(){ this.who = function(){ console.dir(this.fruitType()); } this.fruitType = ko.observable(); } function Apple(t){ Fruit.call(); this.fruitType(t); } Apple.prototype = new Fruit(); Apple.prototype.constructor = Apple; function createApple(t){ return new Apple(t); } return { createApple: createApple } }); require(["FruitFactory"], function(factory) { var golden = factory.createApple("Golden Delicious"); var honey = factory.createApple("Honeycrisp"); golden.who(); honey.who(); return {}; });Producción:
Honeycrisp Honeycrisp ¿Por qué golden.who() produce Honeycrisp en lugar de Golden Delicious ?
jsfiddle completo aquí: https://jsfiddle.net/t2xsr7uz/7/
Creo que puedes arreglarlo pasando explícitamente this al método Fruit.call en tu constructor de Apple :
function Fruit() { this.who = function() { console.dir(this.fruitType()); } this.fruitType = ko.observable(); } function Apple(t) { Fruit.call(this); this.fruitType(t); } Apple.prototype = new Fruit(); Apple.prototype.constructor = Apple; function createApple(t) { return new Apple(t); } var golden = createApple("Golden Delicious"); var honey = createApple("Honeycrisp"); golden.who(); honey.who(); <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>