2015-05-31 15 views
7

Le funzioni incorporate in javascript (ad esempio Object.keys) non hanno una proprietà "prototipo".Javascript: funzioni senza prototipo

Object.keys.prototype === undefined;    // returns true 
Array.prototype.slice.prototype === undefined; // returns true 

Tuttavia, sia function(){...} o new Function() genererà un costruttore (istanza di Funzione) insieme ad un prototipo (istanza di Object). Non è troppo costoso?

Is è possibile creare una funzione di pura invece di un costruttore di in javascript?

risposta

0

E 'una pura funzione quando si chiama senza new

1

La domanda è: "che cosa significa 'creare' loro dire"?

Per tutti intenti e finalità,

function myFunc () { } 

myFunc.constructor = undefined; 
myFunc.prototype = undefined; 

si ottiene ciò che si vuole, da un punto di vista pratico.

In ES6, lambda non dovrebbe avere legami con altre funzioni;

(() => { }).prototype === undefined; // I believe this should be 100% true 

... l'altra domanda ... ... è troppo costoso che si aggiungono funzioni/oggetti creati per ogni funzione ...

.... beh, ci sono giochi correre felicemente sui browser. Parlare del consumo di memoria dalla creazione di funzioni è in genere infinitamente piccolo, al giorno d'oggi (anche se IoT/wearable sarebbe una preoccupazione).
Questo è un micro-ottimizzazione prematuro.

2

Oltre a Math.random, le funzioni integrate in JS sono puramente di progettazione. Non dovresti ricavare una funzione con la dichiarazione new che non farà il lavoro giusto per te.

JavaScript è un linguaggio di programmazione multi-paradigma che espone sia i sensi functional e oop. Quindi, avete funzioni pure senza prototipo:

Math.round // whose typeof is function 
Math.floor // whose typeof is also function 

Sopra, Math possa essere percepita come uno spazio dei nomi, invece di un tipo di oggetto. Quindi è solo un contenitore che fornisce un set di funzioni per te.

Al contrario, se si fa riferimento a funzioni del prototipo oggetti in JavaScript, si otterrà un indefinito a meno che non si fa riferimento a loro tramite prototipo:

Array.map // undefined 
Array.reduce // undefined 

Questo è dovuto al fatto materia che Array non è progettato per essere un namespace come Math, è una classe di oggetti in senso OOP. Quindi è necessario chiamare la funzione tramite il suo esempio come:

var list = new Array(3); 
list.map(function(a){ return 1 }); 

In caso contrario, si può fare riferimento alla funzione tramite prototype per ottenere l'accesso alla funzione di puro dove this oggetto non è vincolata.Vedi seguente dichiarazione:

var list = [1,2,3]; 
typeof(Array.prototype.map); // It's pure, unbound 
Array.prototype.map.call(list, function(a){ return a*2 }); // Usage in a purely-functional way 

Il significato di questo è, JavaScript è stato progettato per essere scrivibile sia in OOP e modi funzionali. Potresti aver bisogno di giocare con il prototipo di funzione dato che ti ho fornito alcuni esempi sopra e questo ti chiarirà ulteriormente :)

Problemi correlati