EDIT Févr. 2012: la réponse ci-dessous ne sont plus exactes. _proto_ est ajoutée à ecmascript6 "normatif option", ce qui signifie qu'il n'est pas nécessaire d'être mis en œuvre, mais si il faut en suivre les règles. C'est actuellement en suspens, mais au moins il sera officiellement partie de JavaScript du cahier des charges.
Cette question est beaucoup plus compliquée qu'il n'y paraît sur la surface, et au-delà de la plupart des peuples échelon de rémunération en ce qui concerne la connaissance de Javascript à l'intérieur.
L' prototype
de la propriété d'un objet est utilisé lors de la création de nouveaux objets enfants de cet objet. Changer cela ne se reflète pas dans l'objet lui-même, plutôt réfléchie quand que l'opposé est utilisé comme un constructeur pour d'autres objets, et a ne sert à rien de modifier le prototype d'un objet existant.
function myFactory(){};
myFactory.prototype = someOtherObject;
var newChild = new myFactory;
newChild.__proto__ === myFactory.prototype === someOtherObject; //true
Les objets internes [[prototype]] de la propriété, ce qui souligne le prototype actuel. La façon dont il fonctionne, c'est à chaque fois qu'une propriété d'un objet est appelé, il va commencer à l'objet et franchissez la [[prototype]] de la chaîne jusqu'à ce qu'il trouve une correspondance, ou après l'échec de la racine de l'Objet prototype. C'est de cette façon Javascript permet d'exécution construction et modification d'objets; il a un plan pour la recherche de ce dont il a besoin.
L' __proto__
propriété existe dans certaines implémentations de (beaucoup de): Mozilla mise en œuvre, tous les webkit ceux que je connais, certains autres. Cette propriété de points à l'intérieur de la [[prototype]] de la propriété et permet de modification post-création des objets. Toutes les propriétés et les fonctions de basculer instantanément pour correspondre au prototype en raison de cette enchaîné de recherche.
Cette fonctionnalité, tout en étant normalisé, maintenant, n'est toujours pas une partie nécessaire de JavaScript, et dans les langues de soutien, il a une forte probabilité de frapper votre code de la unoptimized" de la catégorie. JS moteurs doivent faire de leur mieux pour classer code, en particulier "à chaud" de code qui est accessible très souvent, et si vous êtes en train de faire quelque chose de fantaisie, comme la modification d' __proto__
ils ne sont pas d'optimiser votre code.
Cette messages https://bugzilla.mozilla.org/show_bug.cgi?id=607863 aborde spécifiquement les implémentations actuelles de l' __proto__
et les différences entre eux. Chaque mise en œuvre n'est-elle différente, parce que c'est un dur et le problème non résolu. Tout en Javascript est mutable, sauf un.) la syntaxe b.) objets hôte (DOM existe en dehors de Javascript sur le plan technique) et de la c.) __proto__
. Le reste est entièrement dans les mains de vous, et tous les autres développeurs, de sorte que vous pouvez voir pourquoi __proto__
colle dehors comme un pouce endolori.
Il y a une chose qu' __proto__
permet de qui est par ailleurs impossible de le faire: la désignation d'un objet prototype à moteur d'exécution distinct de son constructeur. C'est un aspect important de cas d'utilisation et est l'une des principales raisons de l' __proto__
n'est pas déjà mort. Il est assez important que c'est un grave sujet de débat dans la formulation de l'Harmonie, ou bientôt connu comme ECMAScript 6. La possibilité de spécifier le prototype d'un objet lors de la création sera une partie de la prochaine version de Javascript et ce sera la cloche indiquant __proto__
's jours sont formellement numérotés.
À court terme, vous pouvez utiliser __proto__
si vous ciblez les navigateurs qui le supportent (pas IE, et pas IE ne le sera jamais). Il est probable que ça marchera dans webkit et moz pour les 10 prochaines années comme ES6 ne sera pas finalisé jusqu'en 2013.
Brendan Eich - re:Approche de nouvelles méthodes de l'Objet dans l'ES5:
Désolé ... mais réglable __proto__
, en dehors de l'objet initialiser cas d'utilisation (c'est à dire, sur un nouvel objet n'est pas encore accessible, analogue à l'ES5 de l'Objet.créer), est une idée terrible. J'écris ceci pour avoir conçu et mis en œuvre réglable __proto__
plus de 12 ans.
... l'absence de stratification est un problème (tenir compte des données JSON avec une clé "__proto__"
). Et le pire, la mutabilité des moyens implémentations doivent vérifier cyclique prototype de chaînes afin d'éviter ilooping. [constante des contrôles pour une récursion infinie sont requis]
Enfin, la mutation d' __proto__
sur un objet existant peut casser non générique des méthodes dans le nouveau prototype de l'objet, qui ne peut pas travailler sur le récepteur (direct) de l'objet dont l' __proto__
. C'est tout simplement une mauvaise pratique, une forme intentionnelle type de confusion, en général.