Dichiarare le proprietà su un prototipo non è affatto un modello anti. Quando guardo un oggetto prototype
, penso "questo è ciò che l'oggetto prototipo di questo tipo ha per dati e metodi".
Altri hanno messo in guardia dal fornire alle proprietà un valore di riferimento nel prototipo, ad esempio: Foo.prototype.bar = [];
--- perché le matrici e gli oggetti sono tipi di riferimento. Un tipo di riferimento è immutabile, quindi ogni istanza di una "classe" si riferisce alla stessa matrice o oggetto. Basta impostarli su null
nel prototipo, quindi assegnare loro un valore nel costruttore.
Includo sempre tutte le proprietà nel prototipo per una ragione molto chiara: Comunicando ad altri programmatori quali proprietà sono disponibili pubblicamente e quali sono i loro valori predefiniti senza richiedere loro di setacciare un costruttore per capirlo.
Ciò risulta particolarmente utile se si sta creando una libreria condivisa che richiede la documentazione.
consideri questo esempio: (formato Documentazione: PDoc)
/**
* class Point
*
* A simple X-Y coordinate class
*
* new Point(x, y)
* - x (Number): X coordinate
* - y (Number): Y coordinate
*
* Creates a new Point object
**/
function Point(x, y) {
/**
* Point#x -> Number
*
* The X or horizontal coordinate
**/
this.x = x;
/**
* Point#y -> Number
*
* The Y or vertical coordinate
**/
this.y = y;
}
Point.prototype = {
constructor: Point,
/**
* Point#isAbove(other) -> bool
* - other (Point): The point to compare this to
*
* Checks to see if this point is above another
**/
isAbove: function(other) {
return this.y > other.y;
}
};
Basta leggere la documentazione è un po 'scomodo qui perché le informazioni sulle proprietà x
e y
sono integrati all'interno della funzione di costruzione.Contrasto che con il "anti-modello" di includere queste proprietà nel prototipo:
/**
* class Point
*
* A simple X-Y coordinate class
*
* new Point(x, y)
* - x (Number): X coordinate
* - y (Number): Y coordinate
*
* Creates a new Point object
**/
function Point(x, y) {
this.x = x;
this.y = y;
}
Point.prototype = {
/**
* Point#x -> Number
*
* The X or horizontal coordinate
**/
x: 0,
/**
* Point#y -> Number
*
* The Y or vertical coordinate
**/
y: 0,
constructor: Point,
/**
* Point#isAbove(other) -> bool
* - other (Point): The point to compare this to
*
* Checks to see if this point is above another
**/
isAbove: function(other) {
return this.y > other.y;
}
};
Ora guardando il prototipo fornisce un'istantanea dell'oggetto reale, che è molto più facile da visualizzare nella tua testa, e più facile per l'autore di scrivere la documentazione. Anche la funzione di costruzione non è ingombra di documentazione e si attiene al business di dare vita a un oggetto Point
.
Il prototipo ha tutto, ed è la fonte canonica di informazioni su ciò che il "prototipo" Point
oggetto ha per entrambi i metodi ei dati .
Direi che lo non incluse le proprietà dei dati nel prototipo è il modello anti.
Dice "proprietà dei dati", che a mio avviso si riferisce alle variabili. Non penso che menzioni nulla sull'aggiunta di funzioni a un prototipo. –
Che cosa hanno detto arxanas. L'esatto preventivo è, "Un corpo di classe può contenere solo metodi, nessuna proprietà di dati. I prototipi con proprietà di dati sono generalmente considerati un anti-pattern, quindi questo semplicemente impone una best practice." In altre parole, per "proprietà dei dati" l'autore significa "proprietà che non sono metodi/funzioni". – ruakh
La tua domanda si basa su un malinteso, non so cosa fare. Non ricordo nemmeno di aver visto i dati inseriti nel prototipo. Non posso davvero modificare la tua domanda per avere dati nel prototipo perché non è un pattern * Spesso vedo *. – Esailija