2012-04-04 14 views
6

Después de experimentar tanto tiempo, descubrí que el método __proto__ o Object.getPrototypeOf() es la forma correcta de atravesar la cadena del prototipo en objetos DOM.Diferencia de comportamiento de Firefox y Chrome entre constructor.prototype?

El uso de una serie de constructor.prototype en realidad no atraviesa la cadena de prototipos en ambos navegadores. (Aunque esta es la manera definida en el estándar ECMA, la propiedad prototipo del constructor es su objeto prototipo).

Cualquier sugerencia o comentario es bienvenido ...

p1 = document.getElementById("test"); // div element 

//Prototype Object of p1 
p2 = element.constructor.prototype; 

//Prototype object of p2 
p3 = element.constructor.prototype.constructor.prototype; 

console.log(p2 === p3); // true in chrome(howcome they same ?), false in firefox 

q2 = element.__proto__; 
q3 = element.__proto__.__proto__; 

console.log(q2 === q3); // false in both browser 

Respuesta

0

creo que mal entendido cómo funciona el constructor/prototipo.

Dada una función de constructor, su .prototype será el prototipo de las cosas construidas con él. El constructor del prototipo apunta a la función constructora.

Por lo tanto, en particular, Element.prototype.constructor === Element debe contener. No necesariamente en los navegadores debido a errores. Es por eso que ves p2 == p3 en Chrome, sin embargo.

1

estoy totalmente de acuerdo con Boris ... Usted debe buscar aquí para más detalles (https://www.google.com/search?q=javascript+prototype+chain) pero básicamente si desea navegar por los elementos en el objeto DOM, sólo tiene que hacer esto, como a continuación:

function exploreElement(element){ 
     contentToString = ""; 
     for (var i in element){ 
      contentToString += i + " : " + element[i] + "<br />"; 
     } 
     document.write(contentToString); 
    } 
    exploreElement(document); 

El prototipo y proto son algo totalmente diferente ...

Si usted tiene una función constructora de esta manera:

function SomeObject(){ 
     this.__proto__.id = "instance_default_name"; 
     SomeObject.id = "SomeObject"; 
     // __proto__ HERE to access the prototype!!! 
    } 

A continuación, puede añadir métodos a este constructor a través de prototipo (que se supone que tiene un div vacío con una "myInstance" Identificación y otro con el id "prueba" en el documento):

SomeObject.prototype.log = function(something){ 
     document.getElementById("myInstance").innerHTML += something + "<br />"; 
    } 

Añadir algunos métodos para fines de prueba:

SomeObject.prototype.setId = function(id){ 
    this.id = id; 
} 
SomeObject.prototype.getId = function(){ 
    return this.id; 
} 
SomeObject.prototype.getClassName = function(){ 
    return SomeObject.id; 
} 

a continuación, puede crear una instancia SomeObject con el nuevo operador y hacer algunas pruebas como esto:

myInstance = new SomeObject(); 
myInstance.setId("instance_1"); 
aDivElement = document.getElementById("test"); 
aDivElement.style.backgroundColor = "rgb(180,150,120)"; 
myInstance.log("p1 = " + aDivElement); 
// [object HTMLDivElement] 
myInstance.log("p1 backgroundColor = " + (aDivElement.style.backgroundColor)); 
myInstance.log("myInstance = " + myInstance); 
// [object Object] an instance of SomeObject 
myInstance.log("myInstance.constructor = " + myInstance.constructor); 
// function SomeObject() { this.__proto__.id = "instance_default_name"; SomeObject.id = "SomeObject"; } 
myInstance.log("myInstance.constructor.prototype = " + myInstance.constructor.prototype); 
// .prototype WHEN CALLED by the instance NOT __proto__ 
// The constructor of myInstance is SomeObject and the prototype of SomeObject is the prototype of all instances of SomeObject 
myInstance.log("myInstance.id = " + myInstance.getId()); 
// id for the instance of SomeObject that you have instanciated 
myInstance.log("SomeObject.prototype.id = " + SomeObject.prototype.getId()); 
// id by default of the prototype 
myInstance.log("myInstance.constructor.prototype.id = " + myInstance.constructor.prototype.getId()); 
// id by default of the prototype 
myInstance.log("myInstance.getClassName() = " + myInstance.getClassName()); 
// myInstance.getClassName() = SomeObject 

No sé si esto te habla un poco, pero espero que esto te ayude en tu búsqueda. Saludos cordiales. Nicolas

Cuestiones relacionadas