¿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ó?
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__
:
EDMA-262 6a Edición (junio 2015):
B.2.2.1 Object.prototype.__proto__
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);
Parece que
Object.getPrototypeOf(passedObject);
Funcionará para esto, y es compatible con los navegadores modernos.
Aquí están las tablas de compatibilidad en MDN
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
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