2010-10-19 9 views
22

Douglas Crockford escribió en su libro (Página 4):método "método" en el libro de Crockford: Javascript: las partes buenas

lo largo del libro, un método method se utiliza para definir nuevos métodos, Esta es su definición:

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

Luego comienza a utilizar este método para agregar method en Number, String, Function, Object, Array, RegExp, y aquí está la lista completa:

P33:

Number.method('integer', function() {...}); 
String.method('trim', function() {...}); 

P40 (no estoy seguro si hay un error de imprenta en la página 41: el final()):

String.method('deentityify', function() {...}()); 

P43 & P44:

Function.method('curry', function() {...}); 

P47 (estoy confundido aquí, don' sé por qué Crockford definir new método, y nunca parece usar new método en el libro):

Function.method('new', function() {...}); 

P48:

Function.method('inherits', function (Parent) {...}); 

P54:

Object.method('superior', function (name) {...}); 

P62:

Array.method('reduce', function (f, value) {...}); 

P79:

Array.method('pop', function() {...}); 
Array.method('push', function() {...}); 
Array.method('shift', function() {...}); 

P82:

Array.method('splice', function (start, deleteCount) {...}); 

P84:

Function.method('bind', function (that) {...}); 

P88:

RegExp.method('test', function (string) {...}); 
String.method('charAt', function (pos) {...}); 

P90 (no estoy seguro si hay un error de imprenta en la página 91: el final()):

String.method('entityify', function() {...}()); 

El definición method se basa en Function, por qué se puede usar en Number, String, Object, Array, RegExp además de Function? ¿Y se puede utilizar este method para otro tipo de datos?

Otra pequeña pregunta: en la página 63 & 64, la definición de Array.dim, Array.matrix, Array.identity no se utilizó anteriormente method, ¿por qué?

Respuesta

20

Todas las funciones nativas en JavaScript heredan de Function.prototype. Number, String, Object, Array y RegExp son todas funciones, por lo tanto, heredan de Function.prototype.

method está destinado a ser llamado en funciones de constructor. Su trabajo es hacer que la función que le proporcione sea un método que existe para cada objeto creado por la función constructora a la que llamó al method. Notará que en las funciones que Crockford pasa al method, utiliza this, que es una referencia al objeto sobre el que se llamó el método. Array.dim, Array.matrix y Array.identity no hacen uso de this porque operan independientemente de cualquier matriz particular y, por lo tanto, no es necesario que sean métodos de objetos de matriz individuales. Se asignan como propiedades de la función Array por conveniencia: igualmente podrían existir por sí mismas como funciones en el ámbito global.

+0

No estoy seguro de si Number, String, Object, Array, RegExp (Tal vez la función booleana y fecha y así) son todas las funciones. Parece que son objetos globales. – John

+1

@John: Te aseguro que todas son funciones. Pruebe 'alert (typeof Number)' etc. si no me cree, o consulte la especificación (sección 15.1.4): http://www.ecma-international.org/publications/standards/Ecma-262.htm . También son propiedades del objeto global, si eso es lo que estabas obteniendo. –

+1

@John: Veo, usted ha revisado la documentación de Mozilla en https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects. Es correcto ya que además de ser funciones, 'Number',' String', 'Object' et al también son objetos, porque todas las funciones son objetos; también es cierto que, como propiedades del objeto global, están disponibles globalmente, por lo que podrían describirse como "objetos globales". Sin embargo, a la luz de la existencia del término oficialmente definido "objeto global", encuentro que el uso que hace Mozilla del término "Objetos Globales" no es útil. –

4

Como un aparte, en P40:

El extremo() significa "utilizar la función que devuelve esta función", no la función externa que lo devuelve.

Si hubiera dejado la final(), una llamada a deentityify devolvería una función, en lugar de una cadena.

En las propias palabras de Douglas Crockford:

Invocamos de inmediato la función que acaba de hacer con el operador(). Esa invocación crea y devuelve la función que se convierte en el método deentityify.

3

La solución dada por @Tim Down es precisa, pero no está completamente clara.

Función objeto vs instancia de función objeto

En primer lugar, en JavaScript, una función es también un objeto. A partir de esto, me refiero no al objeto creado por la construcción new(), sino a la función en sí misma. Para evitar confusiones, me referiría a dichos objetos como Objeto de función, y para el objeto creado utilizando new() constructo de una función como Objeto de instancia de función.

_ proto _ y propiedades prototipo

Cualquier objeto función en Javascript dos propiedades: _ proto _ y prototipo. Además, cualquier objeto de instancia de función (creado con el nuevo constructor) tiene una propiedad _ proto _. El _ proto _ es lo que define la herencia. Algunos buen recurso sobre este punto podría encontrar en

http://zeekat.nl/articles/constructors-considered-mildly-confusing.html

¿Cómo se define la herencia?

Un objeto objA hereda otro objeto ObjC si objA y ObjC están conectados a través de cualquier número de _ proto _. Entonces, si objA tiene _ proto _ igual que objB, y objB tiene _ proto _ igual que objC, entonces objA hereda objB y objC, mientras que objB hereda objC.

¿Qué se entiende por herencia?

Significa cualquier objeto heredar puede uso cualquier propiedad de objeto heredado.

¿Cuál es Function.prototype

Es el objeto cuales _ _ proto de cada objeto función se refiere. Esto significa que cada objeto de función tiene acceso a las propiedades de Function.prototype, ya que cada objeto de función hereda el objeto Function.prototype. Esto también significa que si se agrega la propiedad método al objeto Function.prototype, estaría disponible para todos los objetos de función posibles en javascript. Esto incluye cadenas, números, etc.

this.prototype [name] = func;

esto se refiere a objeto Function cuando el 'método' se invoca desde el objeto Función s como Number, String, etc. lo que significa que ahora tenemos una nueva propiedad en el objeto Función con el nombre "nombre", y es una función 'func'.

Lo bueno es prototipo propiedad del objeto Función

Un objeto función 's prototipo es referido por la instancia del objeto Función' s _ proto _ creado utilizando la nueva construcción de esa función.

Si se ejecuta la siguiente:

Number.method ('entero', function() {...});

then Number.prototype tiene ese entero método definido en él. Esto significa que cada objeto de instancia de función , p. nuevo número (2.4), "heredaría" esta nueva propiedad 'entero' de Number.prototype, ya que ese objeto de instancia de función Number tendría _ proto _ establecido en Number.prototype.

0

Trate de usar este método prototipo:

String.prototype.deentityify = function() { ... } 

continuación:

document.writeln('<">'.deentityify()); 

podemos ver: <">

0

Ejemplo: currying se puede reescribir de la siguiente manera, si alguien se quedó atascado . Veo jsFiddle demo

Function.prototype.curry = function () { 
var slice = Array.prototype.slice; 
var args = slice.apply(arguments); 
var that = this; 
return function() { 
    return that.apply(null,args.concat (slice.apply(arguments))); 
} 
}; 
var add = function(a, b) 
{ 
    return a + b; 
} 
var add1 = add.curry(1); 
document.writeln(add1(6)); // 7 
Cuestiones relacionadas