2011-12-20 17 views
11

¿Podría alguien explicar la importancia de la función prototype.init en JavaScript y cuándo se llama durante la instanciación de objetos?JavaScript prototype.init locura

¿Por qué desea sobrescribirlo con una función vacía?

Estoy leyendo el JavaScript para el libro web y estoy atascado en esto durante las últimas horas ... ¿qué se supone que debe lograr un pedazo de código?

var Class = function(){ 

var klass = function(){ 
    this.init.apply(this, arguments); 
}; 

klass.prototype.init = function(){}; 

// Shortcut to access prototype 
klass.fn = klass.prototype; 

// Shortcut to access class 
klass.fn.parent = klass; 

... 
} 

Esto es simplemente demasiado mágico para mí ... :)

Respuesta

12

No estoy seguro de lo que no entiendo. init es simplemente un método como cualquier otro, que se llama en el constructor y con los mismos parámetros que el constructor. Si está vacío, es solo porque la persona que lo escribió no necesitaba poner nada en él por el momento, pero quería establecer las bases de su clase.

function Foo(a, b, c) { 
    this.init.apply(this, arguments); //This simply calls init with the arguments from Foo 
} 

Foo.prototype.init = function(a, b, c) { 
    console.log(a, b, c); 
} 

var f = new Foo(1, 2, 3); //prints 1 2 3 

http://jsfiddle.net/Hmgch/

+0

Esto es exactamente correcto. 'init' no es especial en JavaScript; es solo la extraña elección de este autor delegar el trabajo del constructor a esta función 'init'. – Domenic

+1

Gracias. No he hecho JS desde 2001 ... ha pasado un tiempo y estas cosas no existían aún en aquel entonces :) Lo que realmente me asustó es mi falso entendimiento de que init era significativo en la creación de objetos por defecto. El autor usa una terminología extraña que no ayuda ... – Moonwalker

+0

@Moonwalker de hecho, el lenguaje ha evolucionado mucho –

2

lo que es una pieza de código que pretende lograr?

Confusión.

var Class = function() { 
    // initialization logic 
} 

// Shortcut to access prototype 
Class.fn = klass.prototype; 

// Shortcut to access class 
Class.fn.constructor = Class; 
+0

De hecho - su mente comienza a ir en círculos ... Por lo que entiendo prototype.constructor tiene absolutamente ninguna importancia, así .. El autor habla de los métodos estáticos en el método de nivel de clase e instancia a nivel de prototipo - suena como si fuera un poco al revés ... – Moonwalker

+0

@Moonwalker 'prototype.constructor' es realmente importante para la metaprogramación. Por ejemplo 'instance2 = new (instance1.constructor)();' – Raynos

+0

Me perdí eso ... thx – Moonwalker

Cuestiones relacionadas