questo Vs. prototipo

Qual è la differenza tra la definizione del metodo “area” come una proprietà di “this” invece di “prototype”?

//console.clear() function Rectangle(w, h) { this.width = w; this.height = h; this.area = function( ) { return this.width * this.height; } } var r = new Rectangle(2, 3); var a = r.area( ); //console.log(a) function Square(s) { this.side= s; } Square.prototype.area = function(){return this.side * this.side; } var r = new Square(2); var a = r.area( ); //console.log(a) 

In JavaScript - The definitive guide nella sezione Prototypes and Inheritance del Chapter 9 , part 1 , l’autore afferma che la definizione del metodo “area” all’interno dell’object prototipo è vantaggiosa, ma la sua spiegazione non è stata davvero comprensibile:

“… l’area di ogni singolo object Rectangle fa sempre riferimento alla stessa funzione (qualcuno potrebbe cambiarla, ovviamente, ma di solito si intende che i metodi di un object siano costanti). È inefficiente usare proprietà regolari per metodi che sono inteso per essere condiviso da tutti gli oggetti della stessa class (cioè tutti gli oggetti creati con lo stesso costruttore). ”

So che questa domanda sembra quasi questa , ma non lo è.

Definire una funzione con whatever = function() { ... } tende a creare quella che viene chiamata una “chiusura”, in cui la funzione può accedere alle variabili locali della funzione che la definisce. Quando dici this.fn = function() { ... } , ogni object ottiene un’istanza della funzione (e una nuova chiusura). Questo è spesso usato per creare variabili “private” in Javascript, ma ha un costo: ogni funzione (in ogni object) è distinta e occupa più memoria.

Quando dici Rectangle.prototype.fn = function() { ... } , un’istanza della funzione è condivisa da tutti i Rectangle . Ciò consente di risparmiare memoria e ridurre al minimo alcune perdite di memoria nei browser che gestiscono le chiusure in modo errato. Se non hai bisogno di membri “privati” o di un altro accesso alle variabili locali della funzione di definizione, di solito è un’idea migliore.