¿Cómo acceder a object prototype en javascript?


En todos los artículos está escrito que JavaScript es un lenguaje basado en prototipos, lo que significa que cada objeto tiene un prototipo (o, más precisamente, una cadena de prototipos).

Hasta ahora, he probado el siguiente fragmento de código:

var F = function();
F.prototype.member1 = 1;
var object1 = new F();
console.log(object1.member1); // prints 1

¿Cómo puedo acceder al objeto prototipo de object1? ¿Hay una forma neutral para hacer eso (es decir, no confiar en la propiedad __proto__? Visto este enlace, pero tal vez hay nuevos desarrollos desde 2010) Si no puedo, podría compartir por favor el ¿razón detrás del capó?

Author: Community, 2011-10-05

4 answers

var f = function();
var instance = new f();

Si conoce el nombre de instance función de clase , simplemente puede acceder al prototipo como:

var prototype = f.prototype;
prototype.someMember = someValue;

Si no lo haces:

1)

var prototype = Object.getPrototypeOf(instance);
prototype.someMember = someValue;

2) o

var prototype = instance.__proto__;
prototype.someMember = someValue;

3) o

var prototype = instance.constructor.prototype; // works only if constructor is properly assigned and not modified
prototype.someMember = someValue;

Para la compatibilidad, puede colocar en su código el siguiente fragmento (y usar siempre Object.getPrototypeOf(instance) para devolver el prototipo):

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;

    };

  }
}

ACTUALIZACIÓN:

Según ECMA-262 6a Edición (junio 2015) __proto__ la propiedad es estandarizado como característica adicional para navegadores web. Todas las últimas ediciones de los principales navegadores lo soportan ahora. Leer más sobre __proto__:

 97
Author: Andrew D.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-20 17:13:30
var F = function(){};
var object1 = new F();
alert(object1.constructor === F);
alert(object1.constructor.prototype === F.prototype);
 5
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-05 13:42:28

Parece que

Object.getPrototypeOf(passedObject);

Funcionará para esto, y es compatible con los navegadores modernos.

Aquí están las tablas de compatibilidad en MDN

 3
Author: HelloWorld,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-14 02:14:52
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
 2
Author: r3mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-08 03:58:32