69 votes

Comment accéder au prototype d'un objet en javascript ?

Dans tous les articles, il est écrit que JavaScript est un langage basé sur les prototypes, 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 par rapport au navigateur de faire cela (je veux dire, ne pas dépendre de __proto__ propriété ? Vu este Si je ne peux pas, pourriez-vous me faire part du raisonnement qui se cache derrière le capot ?

120voto

Andrew D. Points 3555
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 le snippet suivant (et utiliser toujours Object.getPrototypeOf(instance) pour retourner 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;

    };

  }
}

UPDATE :

Selon l'ECMA-262 6ème édition (juin 2015) __proto__ est normalisée en tant que fonctionnalité supplémentaire pour les navigateurs Web. Toutes les dernières éditions des principaux navigateurs la supportent désormais. Plus d'informations sur __proto__ :

8voto

HelloWorld Points 1257

On dirait que

Object.getPrototypeOf(passedObject);

fonctionnera pour cela, et est compatible avec les navigateurs modernes.

Voici les tables de compatibilité sur MDN

6voto

Obi Wan Wesabi Points 3355
var F = function(){};
var object1 = new F();
alert(object1.constructor === F);
alert(object1.constructor.prototype === F.prototype);

2voto

r3mark Points 93
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

-1voto

Kado Points 1
var F = function();
F.prototype.member1 = 1;
var intance = new F();
console.log(instance['member1']);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X