__proto__ VS. prototipo en JavaScript

Resuelto 0x90 asked hace 12 años • 34 respuestas

Esta figura muestra nuevamente que cada objeto tiene un prototipo. La función constructora Foo también tiene la suya propia __proto__, que es Function.prototype, y que a su vez también hace referencia a través de su __proto__propiedad nuevamente a Object.prototype. Por lo tanto, repito, Foo.prototype es solo una propiedad explícita de Foo que se refiere al prototipo de los objetos b y c.

var b = new Foo(20);
var c = new Foo(30);

¿Cuáles son las diferencias entre __proto__y prototype?

ingrese la descripción de la imagen aquí

La cifra fue tomada de dmitrysoshnikov.com .

Nota: ahora existe una segunda edición (2017) del artículo de 2010 anterior.

0x90 avatar Apr 01 '12 04:04 0x90
Aceptado

__proto__es el objeto real que se usa en la cadena de búsqueda para resolver métodos, etc. prototypees el objeto que se usa para construir __proto__cuando creas un objeto con new:

( new Foo ).__proto__ === Foo.prototype
( new Foo ).prototype === undefined
 avatar Mar 31 '2012 21:03

prototypees una propiedad de un objeto Función. Es el prototipo de objetos construidos por esa función.

__proto__es una propiedad interna de un objeto, que apunta a su prototipo. Las normas actuales proporcionan un método equivalente Object.getPrototypeOf(obj), aunque la norma de facto __proto__es más rápida.

Puede encontrar instanceofrelaciones comparando la cadena de una función prototypecon la de un objeto __proto__y puede romper estas relaciones cambiando prototype.

function Point(x, y) {
    this.x = x;
    this.y = y;
}

var myPoint = new Point();

// the following are all true
console.log(myPoint.__proto__ == Point.prototype);
console.log(myPoint.__proto__.__proto__ == Object.prototype);
console.log(myPoint instanceof Point);
console.log(myPoint instanceof Object);
Expandir fragmento

Aquí Pointhay una función constructora que construye un objeto (estructura de datos) de forma procesal. myPointes un objeto construido por Point()so Point.prototypese guarda myPoint.__proto__en ese momento.

Imp avatar Mar 31 '2012 21:03 Imp

prototypeLa propiedad se crea cuando se declara una función.

Por ejemplo:

 function Person(dob){
    this.dob = dob
 }; 

Person.prototypeLa propiedad se crea internamente una vez que declara la función anterior. Se pueden agregar muchas propiedades Person.prototypeque comparten las Personinstancias creadas con new Person().

// adds a new method age to the Person.prototype Object.
Person.prototype.age = function(){return date-dob}; 

Vale la pena señalar que Person.prototypees un Objectliteral por defecto (se puede cambiar según sea necesario).

Cada instancia creada usando new Person()tiene una __proto__propiedad que apunta al archivo Person.prototype. Esta es la cadena que se utiliza para recorrer y encontrar una propiedad de un objeto en particular.

var person1 = new Person(somedate);
var person2 = new Person(somedate);

crea 2 instancias de Person, estos 2 objetos pueden llamar al agemétodo de Person.prototypeas person1.age,.person2.age

En la imagen de arriba de su pregunta, puede ver que Fooes a Function Objecty por lo tanto tiene un __proto__enlace al Function.prototypeque a su vez es una instancia de Objecty tiene un __proto__enlace a Object.prototype. El enlace proto termina aquí __proto__apuntando Object.prototypea null.

Cualquier objeto puede tener acceso a todas las propiedades de su protocadena vinculadas por __proto__, formando así la base para la herencia prototípica.

__proto__No es una forma estándar de acceder a la cadena de prototipos, el enfoque estándar pero similar es utilizar Object.getPrototypeOf(obj).

El siguiente código para instanceofel operador brinda una mejor comprensión:

El operador de clase de objeto instanceofregresa truecuando un objeto es una instancia de una clase, más específicamente si Class.prototypese encuentra en la cadena proto de ese objeto, entonces el objeto es una instancia de esa clase.

function instanceOf(Func){
  var obj = this;
  while(obj !== null){
    if(Object.getPrototypeOf(obj) === Func.prototype)
      return true;
    obj = Object.getPrototypeOf(obj);
  }
  return false;
}      

El método anterior se puede llamar como: instanceOf.call(object, Class)que devuelve verdadero si el objeto es una instancia de Clase.

sid_k_reddy avatar Aug 10 '2013 15:08 sid_k_reddy