¿Cuál es el punto del método prototipo?

10

Estoy leyendo Javascript: The Good Parts , y luché por entender la sección de prototipos .

Después de un pequeño google, llegué a la conclusión de que es agregar propiedades a los objetos después de la declaración de objetos.

Al usar este script que apareció en w3schools, noté que eliminar la línea que agregaba la propiedad del prototipo no tenía ningún efecto . Entonces, ¿cuál es el punto?


//Prototyping

function employee(name,jobtitle,born)
{
this.name=name;
this.jobtitle=jobtitle;
this.born=born;
}

var fred=new employee("Fred Flintstone","Caveman",1970);
employee.prototype.salary=null; //  <---  try removing this line
fred.salary=20000;

document.write (fred.salary);

Fuzz suave
fuente
44
@Raynos bien dicho, pero sugiera un reemplazo también, por ejemplo, documentos de MDN: developer.mozilla.org/en/JavaScript
StuperUser

Respuestas:

13

Así no es como funciona el prototipo. El prototipo se usa en la cadena del prototipo.

Cada vez que intente obtener una propiedad en un objeto, verificará el objeto para ese nombre de propiedad. Si no existe, se verá en el prototipo.

Ejemplo:

var o = {
  "foo": "bar",
  "method": function() { ... }
};

var o2 = Object.create(o);
var o3 = Object.create(o);

console.log(o2.hasOwnProperty("foo")); // false
console.log(o2.foo); // "bar"
console.log(o2.__proto__ === o); // true
o.baz = "foobar";
console.log(o2.baz); // "foobar"

Entonces, el punto del prototipo es simplemente la reutilización y herencia del código.

Raynos
fuente
De acuerdo, ahora entiendo esto. Pero intenté agregar una propiedad dinámicamente, y me dice prototype is undefined---o.prototype.newProp = "mutts nuts";
Mild Fuzz
3
@MildFuzz oes un objeto. La .prototypepropiedad se usa en funciones, ignórela. Solo hazloo.newProp = "mutts nuts"
Raynos
7

Cuando lo hizo fred.salary=20000, agregó el atributo de salario solo a fred. Cuando utilice el prototipo, todos los empleados que creará a partir de ese momento tendrán el atributo de salario.

Supongamos que tiene 100 instancias de empleados y desea agregar un atributo de salario a todos ellos. Puede hacerlo manualmente, iterar sobre cada empleado y agregarlo. O podría usar un prototipo y configurarlo para todos ellos.

El prototipo es útil cuando desea funcionalidad a algo que ya existe. Supongamos que desea agregar un método personalizado a las matrices. Harías algo como:

Array.prototype.my_custom_method = function() {...}

A partir de ahí, todas las matrices que creará tendrán ese método disponible.

adivasile
fuente
3
Me sorprende que nadie haya mencionado que esto está diseñado para mantener bajo el uso de memoria. Si necesita implementar un objeto complejo que tiene mucho código, no desea que el código se repita en cada instancia del objeto. Obviamente, es más probable que las propiedades de los datos sean diferentes en cada caso, pero generalmente solo desea una copia del código, por lo que lo coloca en el prototipo.
Dominic Cronin
1
OMI, esta es la mejor respuesta con diferencia.
The Muffin Man
5

Es posible que desee echar un vistazo a este artículo .

Un lenguaje basado en prototipos tiene la noción de un objeto prototípico, un objeto utilizado como plantilla a partir del cual obtener las propiedades iniciales de un nuevo objeto. Cualquier objeto puede especificar sus propias propiedades, ya sea cuando lo cree o en tiempo de ejecución. Además, cualquier objeto puede asociarse como prototipo para otro objeto, permitiendo que el segundo objeto comparta las propiedades del primer objeto.

Si agrega una propiedad a un objeto que se utiliza como prototipo para un conjunto de objetos, los objetos para los que es el prototipo también obtienen la nueva propiedad.

Esa es una de las principales ventajas de un lenguaje basado en prototipos sobre los basados ​​en clases.

Además, es fácil obtener una herencia OO clásica con JS si es necesario, pero a menudo es difícil obtener un modelo prototipo para un lenguaje que no lo implementa de manera predeterminada.

Jose Faeti
fuente
3
+1 para el artículo de idiomas basados ​​en clase versus en lenguaje prototipo
adivasile el