ejemplos - javascript prototype vs class
¿Cómo puedo ver la cadena de prototipos de un objeto Javascript? (3)
Aquí hay un punto de partida:
Object.prototype.getConstructorNames=function(){
return Object.keys(window).filter(function(e){
return typeof window[e]==="function" && this instanceof window[e]},this)
}
Por supuesto, esto está realmente incompleto, pero creo que funcionará en la mayoría de los casos y si alguien quiere agregar algo, puede hacerlo.
Dado el siguiente código:
function a() {}
function b() {}
b.prototype = new a();
var b1 = new b();
Podemos mantener que se ha añadido un a la cadena de prototipos de b
. Genial. Y, todo lo siguiente es cierto:
b1 instanceof b
b1 instanceof a
b1 instanceof Object
Mi pregunta es, ¿qué pasa si no conocemos los orígenes de b1
antes de tiempo? ¿Cómo podemos descubrir a los miembros de su prototipo de cadena? Idealmente, me gustaría una matriz como [b, a, Object]
o ["b", "a", "Object"]
.
es posible? Creo que he visto una respuesta en alguna parte de SO que describe cómo descubrir solo esto, pero no puedo, por mi vida, volver a encontrarla.
Bueno, el enlace prototipo entre objetos ( [[Prototype]]
) es interno, algunas implementaciones, como Mozilla, lo exponen como obj.__proto__
.
El método Object.getPrototypeOf
de ECMAScript 5th Edition es lo que necesita, pero no está implementado en este momento en la mayoría de los motores de JavaScript.
Dale un vistazo a esta implementation de John Resig, tiene un escollo, se basa en la propiedad del constructor
de los motores que no admiten __proto__
:
if ( typeof Object.getPrototypeOf !== "function" ) {
if ( typeof "test".__proto__ === "object" ) {
Object.getPrototypeOf = function(object){
return object.__proto__;
};
} else {
Object.getPrototypeOf = function(object){
// May break if the constructor has been tampered with
return object.constructor.prototype;
};
}
}
Recuerde que esto no es 100% confiable, ya que la propiedad del constructor
es mutable en cualquier objeto.
editar - Esta respuesta es de 2010, y bastante obsoleta. Desde entonces, el lenguaje ha agregado la API Object.getPrototypeOf()
, que simplifica enormemente el proceso.
Puede usar la propiedad "constructor" del objeto para encontrar el prototipo allí, y luego encadenar a lo largo hasta que llegue al final del arco iris.
function getPrototypes(o) {
return (function gp(o, protos) {
var c = o.constructor;
if (c.prototype) {
protos.push(c.prototype);
return gp(c.prototype, protos);
}
return protos;
})(o, []);
}
(tal vez) (o tal vez no :-) dame un segundo) (bueno, mierda; creo que es posible, pero ignora ese código)
[edit] wow, esto es totalmente asombroso, esa función está cerrada pero no del todo bien; establecer una cadena de prototipos es raro y me siento asustado y solo. Sugiero prestar atención solo a los impresionantes @CMS anteriores.