Javascript - Ottenere 'undefined' quando si cerca di ottenere il prototipo di serie
-
21-08-2019 - |
Domanda
Credo che la sua una fuga di 05:00 cervello, ma sto avendo problemi con la comprensione di questo.
obj = ['a','b'];
alert( obj.prototype ); //returns "undefined"
Perché non obj.prototype
funzione che restituisce Array(){ }
come il prototipo? Lo fa riferimento Array
come il costruttore.
Soluzione
Poiché l'istanza non ha un prototipo, la classe * fa.
Forse si vuole obj.constructor.prototype
o, in alternativa obj.constructor==Array
* Per essere più precisi, la costruttore ha il prototipo, ma naturalmente in JS funzioni = classi = costruttori
Altri suggerimenti
Non sono sicuro che si può accedere al prototype
oggetto da un'istanza di un oggetto. Il seguente comportamento potrebbe aiutare:
alert(Array); // displays "function Array() { [native code] }"
alert(Array.prototype); // displays ""
alert(['a','b'].constructor); // displays "function Array() { [native code] }"
obj.prototype
non restituisce function Array() { ... }
come quello è costruttore dell'oggetto.
Nel tuo esempio, obj
è un'istanza di un Array
, non la classe <=> stesso.
Un altro modo per capire è che, ad esempio, non si può ereditare da un istanza di un oggetto (o classe), è possibile ereditare solo dall'oggetto (o classe) stessa, che nel tuo esempio significa che si potrebbe ereditare dalla <=> oggetto, ma non da un'istanza diretta dell'oggetto Array come <=>.
Secondo le specifiche ECMA, prototipo di collegamento di un oggetto non è visibile, ma la maggior parte dei browser moderni (Firefox, Safari, Chrome) consentono di vedere tramite il __proto__
proprietà, in modo da provare:
obj = ['a','b'];
alert( obj.__proto__ );
Un oggetto ha anche la proprietà `constructor' impostato sulla costruzione, in modo da poter provare:
obj = ['a','b'];
alert( obj.constructor.prototype );
Tuttavia, obj.constructor
può essere modificato dopo la promozione di un oggetto, come si può obj.constructor.prototype
, senza cambiare il puntatore del prototipo reale di obj.
Non è proprio la mia tazza di tè, ma lo fa in questo modo di definire lo rendono "obj" un array? Provato
obj = new Array();
obj[0] = "a";
obj[1] = "b";