2011-10-05 12 views
51

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, cadena de prototipo).¿Cómo acceder a prototipo de objeto en javascript?

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 de navegador para hacer eso (es decir, no depender de la propiedad __proto__? Visto this enlace, pero tal vez haya nuevos desarrollos desde 2010) Si no puedo, ¿podría compartir por favor el razonamiento detrás del capó?

+1

object1.constructor.prototype –

Respuesta

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

Si conoce el nombre de instancefunción de clase, sólo tiene que acceder prototipo como:

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

Si no sabe:

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; 

Por compatibilidad se puede colocar en el código siguiente (y usar siempre Object.getPrototypeOf(instance) para volver 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 6ª edición (junio de 2015) __proto__ la propiedad está estandarizada como característica adicional para navegadores web. Todas las ediciones más recientes de los mejores navegadores lo admiten ahora. Leer más sobre __proto__:

MDN: Object.prototype.__proto__

EDMA-262 6ª edición (junio de 2015): B.2.2.1 Object.prototype.__proto__

+0

con un solo comentario: '__proto__' no funcionará en todos los navegadores – BreakPhreak

+14

No solo' __proto__', sino que además de los tres métodos no funcionará en todos los navegadores. Pero el código de compatibilidad se basa en todos estos métodos.Además, para cinco navegadores principales (IE, FF, Chrome, Safari, Opera) todas las últimas ediciones de navegadores tienen soporte para 'Object.getPrototypeOf()', y el código de compatibilidad solo necesita IE8 y versiones posteriores. –

5
var F = function(){}; 
var object1 = new F(); 
alert(object1.constructor === F); 
alert(object1.constructor.prototype === F.prototype); 
+1

Tenga en cuenta que a veces no funciona. Por ejemplo, a = Function.prototype; un.constructor.prototipo será igual a a. Pero obviamente el prototipo de a es diferente. Puede confirmar que el prototipo de a es Object.prototype marcando un .__ proto__ que es la mejor manera de verificar el prototipo. –

2
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 
Cuestiones relacionadas