Dans tous les articles, il est écrit que JavaScript est un langage basé sur un prototype, ce qui signifie que chaque objet a un prototype (ou, plus précisément, une chaîne de prototypes).
Jusqu'à présent, j'ai essayé l'extrait de code suivant:
var F = function();
F.prototype.member1 = 1;
var object1 = new F();
console.log(object1.member1); // prints 1
Comment puis-je accéder à l'objet prototype de object1
? Existe-t-il un moyen neutre pour le navigateur de le faire (je veux dire, ne pas compter sur __proto__
propriété? Vu ce lien, mais il y a peut-être de nouveaux développements depuis 2010) Si je ne peux pas, pourriez-vous partager la justification derrière le capot?
var f = function();
var instance = new f();
Si vous connaissez le nom de instance
fonction de classe, vous pouvez simplement accéder au prototype en tant que:
var prototype = f.prototype;
prototype.someMember = someValue;
Si vous ne le faites pas:
1)
var prototype = Object.getPrototypeOf(instance);
prototype.someMember = someValue;
2) ou
var prototype = instance.__proto__;
prototype.someMember = someValue;
3) ou
var prototype = instance.constructor.prototype; // works only if constructor is properly assigned and not modified
prototype.someMember = someValue;
Pour des raisons de compatibilité, vous pouvez placer dans votre code l'extrait de code suivant (et utiliser toujours Object.getPrototypeOf(instance)
pour renvoyer le prototype):
if(!Object.getPrototypeOf) {
if(({}).__proto__ === Object.prototype && ([]).__proto__ === Array.prototype) {
Object.getPrototypeOf = function getPrototypeOf(object) {
return object.__proto__;
};
} else {
Object.getPrototypeOf = function getPrototypeOf(object) {
// May break if the constructor has been changed or removed
return object.constructor ? object.constructor.prototype : void 0;
};
}
}
MISE À JOUR:
Selon ECMA-262 6e édition (juin 2015), la propriété __proto__
Est normalisée en tant que fonctionnalité supplémentaire pour les navigateurs Web. Toutes les dernières éditions des meilleurs navigateurs le prennent en charge maintenant. En savoir plus sur __proto__
:
EDMA-262 6e édition (juin 2015): B.2.2.1 Object.prototype.__proto__
Ça ressemble à
Object.getPrototypeOf(passedObject);
fonctionnera pour cela et est compatible avec les navigateurs modernes.
Voici les tableaux de compatibilité sur MDN
var F = function(){};
var object1 = new F();
alert(object1.constructor === F);
alert(object1.constructor.prototype === F.prototype);
var F = function();
F.prototype.member1 = 1;
F.prototype.getClass = F;
var object1 = new F();
object1.member1 = 2;
console.log(object1.getClass.prototype.member1); // prints 1
console.log(object1.member1); // prints 2