herencia ejemplos clases javascript prototype prototypal-inheritance

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.