2010-10-19 10 views
22

Douglas Crockford ha scritto nel suo libro (pagina 4):metodo "metodo" nel libro di Crockford: JavaScript: le parti buone

In tutto il libro, un metodo method è usato per definire nuovi metodi, questa è la sua definizione:

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

Poi si inizia a utilizzare questa method per aggiungere metodo Number, String, Function, Object, Array, RegExp, e qui è la lista completa:

P33:

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

P40 (non so se v'è un errore di stampa nella pagina 41: la fine()):

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

P43 & P44:

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

P47 (Sono confuso qui, don' so perché Crockford definire new metodo, e lui sembra non utilizzare new metodo nel 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 (non so se v'è un errore di stampa nella pagina 91: la fine()):

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

Il definizione method si basa su Function, perché può essere utilizzato in Number, String, Object, Array, RegExp oltre allo Function? E questo method può essere utilizzato per altri tipi di dati?

Un'altra piccola domanda: in Page 63 & 64, la definizione di Array.dim, Array.matrix, Array.identity non ha utilizzato sopra method, perché?

risposta

20

Tutte le funzioni native in JavaScript ereditano da Function.prototype. Number, String, Object, Array e RegExp sono tutte funzioni, quindi ereditano da Function.prototype.

method è destinato a essere chiamato sulle funzioni di costruzione. Il suo compito è quello di rendere la funzione fornita ad esso in un metodo che esiste per ogni oggetto creato dalla funzione di costruzione su cui è stato chiamato method. Si noterà che nelle funzioni che Crockford passa a method, fa uso di this, che è un riferimento all'oggetto su cui è stato chiamato il metodo. Array.dim, Array.matrix e Array.identity non fanno uso di this perché funzionano indipendentemente da qualsiasi matrice particolare e quindi non devono essere metodi di singoli oggetti di matrice. Sono assegnati come proprietà della funzione Array per comodità: potrebbero ugualmente esistere da soli come funzioni nell'ambito globale.

+0

Non sono sicuro se il numero, String, Object, Array, RegExp (Forse funzioni e la data e booleano pure) sono tutte le funzioni. Sembra che siano oggetti globali. – John

+1

@ John: ti assicuro che sono tutte funzioni. Prova 'alert (typeof Number) 'ecc. Se non mi credi, o controlla le specifiche (sezione 15.1.4): http://www.ecma-international.org/publications/standards/Ecma-262.htm . Sono anche proprietà dell'oggetto globale, se è quello che stavi ottenendo. –

+1

@John: Vede, avete esaminato la documentazione di Mozilla su https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects. È corretto in quanto oltre ad essere funzioni, 'Numero',' String', 'Object' e altri sono anche oggetti, perché tutte le funzioni sono oggetti; è anche vero che come proprietà dell'oggetto globale, sono disponibili globalmente, quindi potrebbero essere descritte come "oggetti globali". Tuttavia, alla luce dell'esistenza del termine ufficialmente definito "oggetto globale", trovo l'uso di Mozilla del termine "Oggetti Globali" piuttosto scostante. –

4

Per inciso, il P40:

L'estremità() significa "utilizzare la funzione che questa funzione restituisce", non la funzione esterna che restituisce.

Se avesse lasciato il finale(), una chiamata a deentityify avrebbe restituito una funzione, piuttosto che una stringa.

Nelle parole di Douglas Crockford:

Invochiamo immediatamente la funzione che abbiamo appena fatto con l'operatore(). Quella chiamata crea e restituisce la funzione che diventa il metodo deentityify.

3

La soluzione fornita da @Tim Down è accurata, ma non completamente chiara.

oggetto Function vs esempio Function oggetto

Innanzitutto, in javascript, una funzione è anche un oggetto. Da questo, voglio dire non l'oggetto creato dal costrutto new(), ma dalla funzione stessa. Per evitare confusione, fare riferimento a oggetti come Oggetto funzione e per oggetto creato utilizzando il costrutto new() di una funzione come Oggetto istanza funzione.

_ _ proto e le proprietà del prototipo

Qualsiasi oggetto funzione in javascript ha due proprietà: _ _ proto e prototipo. Inoltre, qualsiasi oggetto di istanza della funzione (creato con il nuovo costruttore) ha una proprietà _proto _. Il _proto _ è ciò che definisce l'ereditarietà. Qualche buona risorsa su questo potrebbe essere trovato alla

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

Come viene definito l'eredità?

Un oggetto objA eredita altro scopo objc se objA e objc sono collegati attraverso un numero qualsiasi di _ _ proto. Quindi, se objA ha _ _ proto pari a objB, e objB ha _ _ proto pari a objc, poi objA eredita objB e objc, mentre objB eredita objc.

Cosa si intende per ereditarietà?

Si intende qualsiasi oggetto che eredita può uso qualsiasi proprietà di oggetto ereditato.

cosa fa Function.prototype

Scopo quale _ _ proto di ogni oggetto funzione riferisce. Ciò significa che ogni oggetto funzione ha accesso alle proprietà di Function.prototype, poiché ogni oggetto funzione eredita l'oggetto Function.prototype. Questo significa anche che se metodo proprietà viene aggiunta all'oggetto Function.prototype, sarebbe disponibile per tutte le possibili oggetti funzione in javascript. Questo include stringhe, numero, ecc.

this.prototype [nome] = func;

questo si riferisce a oggetto Function quando il 'metodo' viene richiamato da un oggetto Funzione s come numero, stringa, ecc il che significa che ora abbiamo una nuova proprietà in oggetto Funzione con nome "nome", ed è una funzione "func".

cosa serve prototipo una proprietà dell'oggetto del Funzione

Un oggetto funzione 's prototipo viene definito dal funzione istanza dell'oggetto' s _ proto _ creato utilizzando il nuovo costrutto di quella funzione.

Se è stato eseguito il seguente:

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

poi Number.prototype ha che intero metodo definito in esso. Ciò significa che ogni oggetto di istanza della funzione , ad es. nuovo numero (2.4), "erediterebbe" questa nuova proprietà "intero" da Number.prototype, dal momento che l'oggetto istanza numero avrebbe il suo _proto _ impostato su Number.prototype.

0

Tenta di utilizzare questo metodo prototipo:

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

Poi:

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

possiamo vedere: <">

0

Esempio: Currying può essere riscritta come segue, se qualcuno è rimasto bloccato . Vedo 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 
Problemi correlati