• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

prototype durchgehend aktiv - Warum????

StechusKaktus

New member
Hallo jswelt Community,

Ich habe folgendes in meiner index.html erstellt:

Code:
Array.prototype.unique	= function() {
		
			var object	= {};
			var tmp		= [];

			for( var i = 0 ; i < this.length; i++ ){
			
				object[ this[i] ] = true;
				
			}	// End for(...).

			for( var i in object ){
				tmp[ tmp.length ] = i;
			}	// End for(...).
			

			console.log("unique:", object, tmp );  // Test für mich, ob alles läuft.
			
			return tmp;
			
		}

Dieser Prototyp soll doppelte Elemente in einem Array rauswerfen.

Nun habe ich aber mit console.log festgestellt, dass beim laden meiner index.html der Prototyp durchgehen aktiv ist. Also dauerhaft durchläuft.
Ist das normal so? Weil das passt mir irgendwie garnicht.
Ich habe den Prototypen am Anfang meine index.html gesetzt, sodass beim laden der Seite dies gleich erzeugt wird. Und es wird auch nur 1x "gestartet".
Habe ich was beim Prototypen nicht richtig verstanden? Oder muss ich irgendwelche Einstellungen noch vornehmen?

Ich hoffe, ihr könnt mich aufklären, was ich evtl. Falsch gemacht oder nicht richtig verstanden habe.

Grüße
 
In dem Quellcode siehst du ja eine console ausgabe.
Und diese wird dauerthaft ausgegeben. Was meiner Meinung nach doch aber nicht sein dürfte, oder?

Damit ihr sehen könnt, wie ich das eingebunden habe:

HTML:
<!DOCTYPE html>
<html>
<head>

        <meta http-equiv="X-UA-Compatible" content="chrome=1"/> <!-- If Google's chrome frame installed, use it! -->
        <meta charset="utf-8"/>
        <meta name="viewport" content="width=device-width, initial-scale=1"/>

		<link rel="stylesheet" href="css/style1.css" type="text/css"  />
		<link rel="stylesheet" href="css/slide.css" type="text/css" media="screen" />		<!-- Slider-Style -->
		<link rel="stylesheet" href="jQuery/jui_dropdown-master/jquery.jui_dropdown.css" type="text/css" />
		<!-- Einige Scripte... -->
		<script type="text/javascript" src="jQuery/jui_dropdown-master/jquery.jui_dropdown.js"></script>
		<script type="text/javascript" src="paperjs/dist/paper.js"></script> 
</head>

<body onload="initPage();" onunload="exitPage();">
	

	<script type="text/paperscript" canvas="myCanvas">
		
                // Variablen

                // ....

		// Prototypen.
		Array.prototype.unique	= function(){	// Prototyp, welcher doppelte Einträge in einem Array entfernt.
		
			var object	= {};
			var tmp		= [];

			for( var i = 0 ; i < this.length; i++ ){
			
				object[ this[i] ] = true;
				
			}	// End for(...).

			for( var i in object ){
			
				tmp[ tmp.length ] = i;
				
			}	// End for(...).
			
			return tmp;
			
		}	// End Array.prototype.unique.

//....
 
Leider kenne ich mich mit Paperscript nicht aus. Bei mir funktioniert im normalen Javascript-Kontext diese Funktion einwandfrei. Dein Problem muss daran liegen, wie sie verwendet wird. Poste doch mal den Zusammenhang, in dem sie aufgerufen wird.
 
Zuletzt bearbeitet:
StechusKaktus schrieb:
In dem Quellcode siehst du ja eine console ausgabe.
Und diese wird dauerthaft ausgegeben. Was meiner Meinung nach doch aber nicht sein dürfte, oder?
Doch ein console.log wird immer angezeigt. Dei Ausgabe verhält sich in der regel so:
Ist ein console.log in einer Schleife und der Inhalt ist immer der gleiche, dann gebe den Inhalt aus und schreibe die Anzahl der Schleifendurchläufe(Ausgaben) links neben den Inhalt.
Ist der Inhalt in jeden Schleifen Aufruf anders, mache einen Zeilenumbruch. Das selbe trift auch für ein Funktion zu die immer aufgerufen wird.

log.png
Code:
<script>
for(var i=0;i<4;i++){
    console.log("log in Schleife");
   
}
function gibAus(){
console.log("log wo anders"); 
}
gibAus();
gibAus();
gibAus();
</script>

Links über der 4 ist das clear console Symbol(in Chrome), damit löscht du die Ausgaben. Wenn also der Prototyp immer weiter läuft kommt eine weitere Ausgabe+das sich die Zahl immer erhört.
In FF ist das genau so.

VG, Xorg1990
 
Und was machst du dann mit IE8 oder kleiner? Dachte die prototype-Variante wäre gängige Praxis?

Ich dachte auch, dass es mit der prototype Variante eine gängige Methode wäre. Habe solche Vorschläge schon auf mehreren Seiten gesehen. Wobei es immer eine Person gab, die meinte, es ist nicht sauber.
Jetzt bin ich etwas verwirrt. Was ist denn nun eine gute Variante? ^^

Poste doch mal den Zusammenhang, in dem sie aufgerufen wird.

Der Prototyp wird auf meiner Index.html / Start html erzeugt. Dann wird dieser Prototyp halt in irgendwelchen Funktionen aufgerufen,
wenn ein Array bearbeitet werden soll. Dabei werden diese Funktionen erst nach einer bestimmten Aktion, wie zum Beispiel: Mouse Klick aufgerufen.
Es kann also nicht immer zu aufgerufen werden.

Habe eben eine Beispiel html angefertigt, sodass ihr mein Problem besser sehen könnt. Dabei ist mir wohl der Fehler aufgefallen.
Ich habe in Paper.js eine Funktion benutzt, welche durchgehend die Canvas aktualisiert, sodass auch darauf "gezeichnet" werden kann, auch wenn kein Fokus darauf liegt.
Dadurch ruft er immer wieder den prototypen auf, was ich nicht ganz verstehe, wieso er das macht.

In der Beispiel test.html könnt ihr das gut sehen. Die function onFrame() ist auskommentiert.

Habt ihr sonst irgendwelche Lösungsvorschläge, wie ich das durchgehende Aufrufen des prototypen unterbinden kann? Oder sollte ich das einfach weglassen und mir
eine "normale" function schreiben, mit der ich dann einen übergebenen Array bearbeite?

Tipps und Tricks?

Viele Danke für eure Hilfe.


Hier ist die testhtml.rar. Hier konnte ich die rar nicht hochladen: ungültiges Format.
Wenn ihr also das Problem mal genauer sehen möchtet:
Paper.js ist mit drin und es muss nichts installiert werden.
Kostenlos und ohne Anmeldung Bilder und Dateien hochladen!
 
mir eine "normale" function schreiben
Damit wirst Du das Problem des wiederholten Aufrufes nicht lösen, denn dann wird diese andere Funktion wiederholt aufgerufen werden. Ich würde das wiederholte Aufrufen akzeptieren, denn es wird sowieso anderer Code wiederholt ausgeführt, was man nur nicht sieht, weil kein console.log drin ist. Dieses Paperskript wird schon seine Gründe dafür haben.
 
Ich kann da nirgends einen Aufruf der unique-Methode finden... welchen Browser verwendest du?

PS: Es gibt bessere und sicherere Methoden um sowas zu machen:
Code:
Array.prototype.unique = function(){
	var unique = [];
	this.forEach(function(entry){
		if (unique.indexOf(entry) === -1){
			unique.push(entry);
		}
	});
	return unique
};
PPS: Prototype ist genau der richtige Ort um sowas zu platzieren.
PPPS:
Und was machst du dann mit IE8 oder kleiner?
Wer den IE8 oder sogar kleiner noch verwendet handelt grob fahrlässig - und zwar auch gegenüber allen, die auch im selben lokalen Netz sind.
 
Zurück
Oben