(1) Ich denke nicht, Speicher zu sparen allein ist ein guter Grund, um .prototype zu verwenden, es sei denn, Sie werden wirklich extrem mit Duplizieren von Objekten.
(2) Die Idee der statischen Eigenschaften ist nicht wirklich ein Grund, .prototype (IMHO) zu verwenden, weil es sich nicht wie eine traditionelle statische Eigenschaft verhält. Sie (so weit ich weiß) benötigen immer eine Objektinstanz, bevor Sie auf die Eigenschaft "static" zugreifen können, was sie überhaupt nicht statisch macht.
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."
Es soll beachtet werden, dass diese „statisch“ Idee nicht nur auf Eigenschaften gilt, sondern für alle Mitglieder, die Methoden (Funktionen), aus einer traditionellen OO Perspektive umfasst.
Es ist besser, an Prototypen (wieder IMHO) als injected singleton Objekte mit Verhaltensweisen zu denken, die an Instanzobjekte angehängt werden. Alle Instanzen von Car() können ihre eigenen Instanzmitglieder haben, aber jede Instanz von Car() wird auch automatisch mit allen Mitgliedern/Verhaltensweisen des Car.prototypes "injiziert". Es ist technisch nicht dasselbe, aber ich finde es praktisch, auf diese Weise über Prototypen nachzudenken.
//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 verhält wie ein Singleton-Objekt, dessen Mitglieder/Verhaltensweisen in Beispiel Objekte des Typs Auto injiziert wurden.
(3) Prototypen sollten nicht wegen Vererbung verwechselt werden. Sie können Verhalten erhalten, das als Vererbung erscheint, aber nicht. Die Member/Verhaltensweisen auf dem Prototyp verbleiben auf dem Prototypobjekt. Sie werden nicht Mitglieder/Verhaltensweisen Ihrer abgeleiteten Klasse, wie wahre Vererbung. Deshalb beschreibe ich es eher so, als würde der Prototyp in deine Instanz "injiziert" werden.
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"!
Also die Frage direkt zu beantworten: Gibt es einen Nutzen Prototyp statt erklärt Eigenschaften für das Objekt selbst zu verwenden?
Ja, wenn Sie die Verhaltensimplementierung unter Instanzobjekten eines bestimmten Typs teilen möchten.Als Zufall reduzieren Sie Ihren Speicherbedarf, aber das ist kein Grund, Prototypen zu verwenden. Weder "statische Eigenschaften erstellen" (was sie nicht sind), noch Vererbung (was nicht ist).
Ich bin mir nicht sicher, was Sie fragen ... Sie scheinen zu sagen "Sie können einfach tun ...", aber dann in dem Kommentar in diesem Skript sagen Sie "kein guter Weg, es zu tun" . Widerspricht sich das nicht selbst? – Joeytje50
Ich glaube, er merkte, dass seine Gedanken während der Frage falsch lagen. Jedenfalls war er nicht auf Stapelwechsel, seit er die Frage vor 18 Monaten gestellt hatte, also hatte er keinen Sinn, sich an ihn zu wenden. Es war ich, der sich immer noch fragt ... – Aerovistae
Wenn du keinen Prototyp verwendest, kannst du die Funktion tun mustang() {car.apply (this); } – Serge