Vererbung

DataFox

Erfahrenes Mitglied
Ich versuche folgendes:

Code:
Cool = {
    hallo : function() {
        alert('hallo');
    },
    cu : function() {
        alert('see you!');
    }
}

Eins = {
    x : 'foo'
}
Eins.prototype = Cool;

Eins.hallo();

Aber es funkioniert nicht.

TypeError: Eins.hallo is not a function

Wie kann ich die Vererbung realisieren, ohne jede einzelne Methode zuzuweisen?

Gruß
DataFox
 
Javascript:
Cool = function(){
    this.hallo= function() {
        alert('hallo');
    }
    this.cu = function() {
        alert('see you!');
    }
}

Eins=new Cool;
Eins.x='foo';
Eins.hallo();
 
Mhm das verwundert mich nun da Object eigentlich die Methode Object.prototype besitzt in der Regel.

Denn Date , Array etc leiten sich alle von Object ab. Aber es kann möglich sein das was Du dort hast bereits ein Objekt ist. Also in der Objekt Notation und es somit keine Konstruktor Funktion gibt.

Mit einen simplen Trick geht es dennoch , angenommen wir schreiben uns ne Funktion aber das ist mehr dazu da um Objekte zu erweitern und macht der Entwickler von dem Prototype Framework so. Wenn mich einer fragt nicht die optimalste Lösung aber kann man doch ab und zu gut gebrauchen um JSON Objekte zu erweitern.

Code:
Object.extend = function (object,source) {
    for(property in source) {
        object[property] = source[property]; 
    }
};

var object1 = {
    name:"test",
    getName:function(){
        return this.name;
    }
}

var object2 = {
    alter:10,
    getAlter:function(){
        return this.alter;
    }
}

Object.extend(object2,object1);

// nun sollte wenn alles gut gelaufen ist 
// object2 alles von Object 1 übernommen haben
for(key in object2) alert(key);
 
Oder noch ne andere Variante:
Javascript:
if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}

Cool = {
    hallo : function() {
        alert('hallo');
    },
    cu : function() {
        alert('see you!');
    }
}

Eins    = Object.create(Cool);
Eins.x  ='foo';
Eins.hallo();
Zwei    = Object.create(Eins);
alert(Zwei.x);

Hier gefunden: http://javascript.crockford.com/prototypal.html
Und wenn ein "JS-Papst" darauf schwört, ist das fast soetwas wie das 11.Gebot :suspekt:
 
Hallo,

hier noch ne kleine Erweiterung zur obigen Variante um den Aufruf einer Methode der "Basis-Klasse":
Javascript:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>JS Inheritance</title>
  </head>
  <body>
  	<script type="text/javascript">
  		
		if(typeof Object.create !== 'function'){
			Object.create = function(base){
				function Class() {};
				Class.prototype = base;
				return new Class();
			};
		}
		
		
		var base = new function(){
			var value = "base";
			this.getValue = function(){
				return value;
			}	
		};
		
		alert(base.getValue());
		
	 	var derived = Object.create(base);
		
		derived.getValue = function(){
			return this.__proto__.getValue() + "->" + "derived";
		};
		
		alert(derived.getValue());
		
		var derived2 = Object.create(derived);
		
		derived2.getValue = function(){
			return this.__proto__.getValue() + "->" + "derived2";
		};
		
		alert(derived2.getValue());
	
  	</script>
  </body>
</html>

//Edit sorry für das herauskramen des alten Threads...

Gruß Tom
 
Zurück