2011-07-29 12 views
22

Estoy leyendo de Douglas Crockford JavaScript: The Good Parts, y estoy un poco confundido acerca de algo. En el capítulo 4, en Tipos de aumento, crea un atajo para agregar un método.Aumento de tipos en JavaScript

Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

Dice:

Al aumentar Function.prototype con un método 'método', ya no tenemos que escribir el nombre de la propiedad prototipo. Ese poco de fealdad ahora se puede ocultar.

A continuación, usa esto para agregar un método 'entero' al prototipo de número con esto.

Number.method('integer', function() { 
    return Math[this < 0 ? 'ceil' : 'floor'](this); 
}); 

document.writeln((-10/3).integer()); // -3 

estoy un poco confundido aquí ... porque hemos añadido un método 'método' a la función prototipo, no es el prototipo de Número. Y que yo sepa, el objeto Number no hereda del prototipo Function (aunque tal vez estoy equivocado). Veo que esto funciona, pero no entiendo por qué los objetos Number pueden hacer uso de este método 'método' para agregar ... métodos.

+0

Esta es una buena pregunta.Me tomó un tiempo entender el código, pero finalmente lo conseguí. – Paul

+0

gracias a todos por las buenas respuestas. eso tiene sentido ahora. –

+2

Un seguimiento de mi pregunta es cuál es el punto del primer bit de código. Supongo que no entiendo su cita. ¿Cómo es este método de 'método' más eficiente o mejor que simplemente agregar directamente el método al prototipo de Número directamente? De esta manera: Number.prototype.integer = function() { return Math [this <0? 'ceil': 'piso'] (esto); } –

Respuesta

4

Number es de hecho una función. Cualquier constructor es una función.

Una forma de pensar acerca de los tipos en javascript es decir que un tipo es solo una función Foo que tiene una propiedad .prototype. Este es el prototipo de cualquier objeto que se crea con la palabra clave new, como en new Foo(). Por convenio Foo está en mayúscula para indicar que es un constructor.

2

He aquí un ejemplo que podría ayudar:

var num = Number('1.2'); 
alert(num instanceof Number); // true 
alert(num instanceof Function); // false 
alert(Number instanceof Number); // false 
alert(Number instanceof Function); // true 

Otra forma de pensar en ello es que en Javascript Function tira una doble función como el tipo de clase - la clase de tipos. Por lo tanto, esto es agregar un método a los tipos.

+1

'alerta (num instanceof Number);' Este es 'false'. – ChandlerQ

+0

@AmareKnight: Bueno ... mierda. Esa es una "característica" de Java que no necesitaba. –

3
Function.prototype.method = function (name, func) { 
    this.prototype[name] = func; 
    return this; 
}; 

Bueno, en este bloque de instrucciones ha creado un método llamado método que es accesible para todos los objetos a través de la herencia prototípica. Las funciones se derivan de Function.prototype que se deriva de Object.prototype. Por lo tanto, las cadenas y los números podrán acceder al método Object.prototype llamado método en esta declaración.

Number.method('integer', function() { 
    return Math[this < 0 ? 'ceil' : 'floor'](this); 
    }); 

document.writeln((-10/3).integer()); // -3 

En este segundo bloque que son básicamente una llamada al método que ya está disponible en el prototipo del objeto y pasar el parámetro requerido en este nombre del caso = 'entero' y el valor igual a

function() { 
    return Math[this < 0 ? 'ceil' : 'floor'](this); 
    }); 

último en la última declaración, usted pasa el par de nombre y valor para el resultado de -3

Cuestiones relacionadas