2013-06-26 2 views
3

J'ai lu sur le javascript prototype chaînage et, comme je l'ai compris, il y a un Object.prototype global qui est la base pour d'autres prototypes, tels que Array.prototype, qui peut être la base pour un autre prototype. Tout comme l'héritage dans la POO basée sur les classes. C'est très bien.javascript prototypage chaînage - obtenir le parent du parent de

Maintenant, je veux vérifier et comparer des prototypes d'objets distincts. Si le prototype de Array est basé sur Object.prototype, je suppose que quelque chose comme Array.prototype.prototype devrait être possible. Mais il est indéfini:

> Array.prototype.prototype 
undefined 

Et quand je tape __proto__ au lieu de prototype, je reçois:

> Array.__proto__ 
[Function: Empty] 
> Object.__proto__ 
[Function: Empty] 
> Array.__proto__.__proto__ 
{} 

(sortie de la console est prise de nodejs). J'ai des questions suivantes:

  • comment puis-je accéder au «prototype parent» d'un prototype? Quelle est la différence entre prototype et __proto__?

Répondre

4

Je crois que vous êtes à la recherche:

Object.getPrototypeOf(Array.prototype); 
// The same as Object.prototype 

(qui est une caractéristique ES5, not compatible with some older browsers).

Quelle est la différence entre le prototype et __proto__

La prototype propriété appartient toujours à une fonction constructeur (comme Object, Array et constructeurs personnalisés). La propriété __proto__ existe sur les instances créées avec de tels constructeurs et pointe sur le même objet que constructor.prototype.

Par exemple:

function MyClass(){} 
var myObj = new MyClass(); 
myObj.__proto__ === MyClass.prototype; // true 

Dans les exemples que vous avez données, Array.__proto__ est en fait l'objet prototype de la fonction constructeur - et non sa propriété prototype. C'est pourquoi c'est [Function: Empty], car Array est une fonction, une instance du constructeur par défaut Function. Le __proto__ de quelque instance de matrice spécifique est le même que Array.prototype:

var arr = []; 
arr.__proto__ === Array.prototype; // true 
+0

Pas exactement. 'Array.prototype' lui-même est" * le même que le '__proto__' d'une instance de tableau *", pas son prototype. – Bergi

+0

@Bergi Si c'est à propos du commentaire qui était sur mon premier bloc de code, vous avez raison. Supprimé – bfavaretto

Questions connexes