(1) No creo que la conservación de la memoria por sí solo es una razón válida para utilizar .prototype, a menos que usted está recibiendo realmente extremo con duplicación de objetos.
(2) La idea de las propiedades estáticas no es realmente una razón para usar .prototype o bien (en mi humilde opinión), porque no se comporta como una propiedad estática tradicional. Usted (hasta donde yo sé) siempre necesita una instancia de objeto antes de poder acceder a la propiedad "estática", lo que hace que no sea para nada estática.
function Car() {}
Car.prototype.Engine = "V8";
// I can't access Car.Engine... I'll always need an instance.
alert(new Car().Engine);
// or
var car1 = new Car();
alert(car1.Engine); //you always need an instance.
//unless you wanted to do
alert(Car.prototype.Engine); //this is more like a static property, but has an
//unintended consequence that every instance of Car also receives a .Engine
//behavior, so don't do this just to create a "static property."
Cabe señalar que esta idea "estática" no sólo se aplica a las propiedades pero todos los miembros, que incluye métodos (funciones), desde una perspectiva OO tradicional.
Es mejor pensar en prototipos (de nuevo, en mi humilde opinión) como simples objetos inyectados con comportamientos que se vinculan con los objetos instancia. Todas las instancias de Car() pueden tener sus propios miembros de instancia, pero cada instancia de Car() también se inyectará "automáticamente" con todos los miembros/comportamientos de Car.prototype. No es técnicamente lo mismo, pero me parece conveniente pensar en prototipos de esa manera.
//define Car and Car.GoFast
function Car() {}
Car.prototype.GoFast = function() { alert('vroom!'); };
var car1 = new Car();
var car2 = new Car();
car1.GoFast();
car2.GoFast(); //both call to same GoFast implementation on Car.prototype
//change the GoFast implementation
Car.prototype.GoFast = function() { alert('vvvvvrrrrroooooooooommmmm!!!!!'); };
car1.GoFast();
car2.GoFast(); //both have been "updated" with the new implementation because
//both car1 and car2 are pointing to the same (singleton) Car.prototype object!
Car.prototype se comporta como un objeto singleton cuyos miembros/comportamientos han sido inyectado en instancia objetos de tipo de coches.
(3) Los prototipos no deben confundirse para la herencia. Puede obtener un comportamiento que parece ser herencia, pero no lo es. Los miembros/comportamientos en el prototipo permanecen en el objeto prototipo. No se convierten en miembros/comportamientos de su clase derivada, como la verdadera herencia. Es por eso que lo describo más como el prototipo que se "inyecta" en su instancia.
function Car() {}
Car.prototype.Engine = "V8";
var car1 = new Car();
var car2 = new Car();
alert(car1.Engine); //alerts "V8"
//There is no "Engine" variable defined within the instance scope of 'car1'.
//Javascript searches the scope of car1's Type.prototype object to find 'Engine'.
//Equivalent to: Object.getPrototypeOf(car1).Engine
//But if we create 'Engine' within the scope of car1
car1.Engine = "V6"; //Car.prototype was never accessed or updated
alert(car1.Engine); //we get "V6"
alert(car2.Engine); //we still get "V8"
alert(Object.getPrototypeOf(car1).Engine); //we still get "V8"!
Así que para responder a la pregunta directamente: ¿Hay alguna ventaja de utilizar prototipo en lugar de declarar las propiedades del objeto en sí?
Sí, cuando se quiere compartir la implementación comportamiento entre los objetos de instancia de un tipo dado.Como una coincidencia, reducirá la huella de su memoria, pero esa no es una razón sola para usar prototipos. Tampoco es "crear propiedades estáticas" (que no son), o por herencia (que no lo es).
No estoy seguro de lo que estás preguntando ... Parece que dices "simplemente puedes hacer ...", pero luego en el comentario de ese guión dices "no hay una buena manera de [hacerlo]" . ¿No se contradice a sí mismo? – Joeytje50
Creo que se dio cuenta de que sus pensamientos estaban equivocados en parte al hacer la pregunta. En cualquier caso, él no ha estado en stackexchange desde que publicó la pregunta hace 18 meses, por lo que no tiene sentido hablar con él. Fui yo quien todavía se preguntaba ... – Aerovistae
si no usas el prototipo, puedes hacer la función mustang() {car.apply (this); } – Serge