2010-03-03 13 views
5

Entonces, estaba leyendo en John Resig blog, vi su micro-templating javascript engine y decidí probar e implementar mi propio sistema de gestión de plantillas para javascript, para profundizar mi comprensión de la herencia de prototipos . Sin embargo, en el momento en que comencé a escribirlo, me encontré con un problema.Cómo se llaman funciones de objetos padre en objetos secundarios en javascript

Para empezar, aquí es mi código de base:

function template_manager() { }; 

template_manager.prototype = { 
    tags: {}, 
    templates: {}, 
    output: {}, 
    default_template: "default", 
    set: function (tags, template_name) { 
     template_name = "Greetings!"; 
     //template_name = this._util.template(this.nothing, this.default_template); 
     console.log(template_name); 
    }, 
    get: function(tags, template_name) { 
     console.log("Getting"); 
    }, 
    unset: function(tags, template_name) { 
     console.log("Removing"); 
    }, 
    render: function(template_name) { 
     console.log("Rendering"); 
    }, 
    //_util goes here 
}; 

// Take it for a quick test drive. 
test = new template_manager; 
test.set(); 
test.get(); 
test.unset(); 
test.render(); 

Entonces empecé a trabajar en un código común, y decidió ponerlo en un objeto de utilidad:

_util: { 
     // Used to set the default values for optional arguments 
     optional: function(obj, def_value) { 
      return (typeof obj === "nothing") ? obj : def_value; 
     }, 
     template: function(template_name) { 
      return this._util.optional(template_name, this.default_template); 
     }, 
    }, 

Y ahora , cuando intento llamar a mi función _util.template() en mi función set(), por supuesto obtengo un error porque this apunta al objeto _util en lugar del objeto template_manager. Eché un vistazo al método jQuery extend, y creo que entiendo lo que está haciendo. Mi pregunta es: ¿Necesito para implementar mi propio/use el método extend de jQuery, o hay otra forma de que llame al objeto _util desde mi objeto _util?

(PS He mirado en Douglas Crockford article sobre la herencia de prototipo, y yo creo la respuesta es no, pero me temo que no entiendo completamente todavía.)

+0

@Chris, me sirve para no hacer doble verificación. Gracias por atrapar eso! –

Respuesta

8

Se puede utilizar call o apply es decir

template_manager.prototype = { 
    set: function (tags, template_name) { 
     template_name = "Greetings!"; 
     template_name = this._util.optional.call(this, this.nothing, this.default_template); 
     console.log(template_name); 
    } 
} 

Ver "Getting Out of Binding Situations in JavaScript" artículo para una explicación más explícita.

+0

La solución funciona y el artículo hace un excelente trabajo explicando el alcance con más detalle. Muchas gracias Li0liQ! –

+0

@Sean Vieira, eres bienvenido. – Li0liQ

Cuestiones relacionadas