Wie kan ich das aber machen, ohne das proprietäre "__proto__"?
Nicht. (Nicht in der Reihenfolge.) Es gibt keine standardisierte Möglichkeit, um den Prototyp nachträglich zu überschreiben.
function extend(child, parent){
for (property in parent.prototype) {
if (typeof child.prototype[property] == "undefined") {
child.prototype[property] = parent.prototype[property];
}
}
return child;
}
Du verwechselst hier anscheinend etwas.
Es gibt \_\_proto\_\_ (intern [[Prototype]]) und prototype. Letztere haben nur Funktionen und damit lässt sich der Prototyp (also \_\_proto\_\_/[[Prototype]]) von Objekten setzen, die mit new mithilfe diese Funktion erzeugt werden.
Die obige Helferfunktion mixt die Member eines Konstruktor-Prototyps in einen anderen hinein. Das geht, ist dann aber keine prototypische Delegation zwischen child und parent, sondern einfach ein Kopieren der Member.
Sie mixt nicht die Member eines Prototyps eines beliebigen Objektes in einen anderen Objekt-Prototyp ein. Das geht nur, wenn man Zugriff auf die Prototyp-Kette hat. Das ginge natürlich \_\_proto\_\_ oder Object.getPrototypeOf() aus ES5.
> Oder indem ich die o.g. Objekte erstmal als Funktionen definiere, dann den prototype der erbenden Funktion auf new ParentFunc(); setzte und mit new ChildClass(); ein Objekt erzeuge?
Ich verstehe den Satz nicht. Natürlich kannst du folgendes schreiben:
~~~javascript
var myObject = {
textIndivid : "myIndividualText",
textAll : "objtext",
fun : function () {
alert(this.textIndivid);
}
};
function f(){}
f.prototype = myObject;
var myExtObject = new f;
myExtObject.textIndivid = "extIndividText";
myExtObject.fun();//"extIndividText"
alert(myExtObject.textAll);//"objtext"
Dieser Schritt ist ja genau der, den Object.create wegkapselt.
Ich wollte irgendwie gerne auf des "new" verzichten bzw. schauen, wie es mit Objektliteralen geht.
Mit Object.create, aber wie gesagt nicht in der Reihenfolge.
Noch ein Link dazu: Object-Based Inheritance For ECMAScript 5
Mathias