Javascript - Ottenere 'undefined' quando si cerca di ottenere il prototipo di serie

StackOverflow https://stackoverflow.com/questions/673107

  •  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.

È stato utile?

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";

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top