Zur Vermeidung von Namenskonflikten und aus Sicherheitsgründen sollten globale Objekte,
die systemweit verwendet werden können,
sparsam reserviert werden.
- Direkte Objektzuordnung (Direct Assignment)
Beispiel 1
-
Das folgende Objekt obj1
hat eine Anzahl obj1.anz
,
ein HTML-Objekt obj1.div
und die Funktioen
obj1.reset()
,
obj1.add()
,
obj1.show()
Für den Zugriff auf ein HTML-DOM-Objekt muß
das globale window
-Element mit window.document
vorhanden sein.
Code Snippet: Direct Assignment
- <script>
- var obj1 = {
- anz: 0,
- div: function () {
- return window.document.getElementById("SPAN1");
- }
- };
- obj1.reset = function () { obj1.anz = 0; };
- obj1.add = function (x) { x = x || 1; obj1.anz += x; };
- obj1.show = function () { obj1.div().innerHTML = obj1.anz; };
- </script>
-
- <a href="javascript:obj1.reset()"> reset() </a> |
- <a href="javascript:obj1.add()" >add() </a> |
- <a href="javascript:obj1.show()" >show() </a> ==> <span id="SPAN1"></span>
Teste:
reset() |
add() |
show() ==>
- Object Literal Notation
Beispiel 2
-
Das folgende Beispiel gleicht dem vorherigen.
Objektintern wird aber anstelle von
obj1.anz
, obj1.add
, obj1.show
auch
this.anz
, this.add
, this.show
verwendet.
Im Objekt obj2
wird intern die this
-Referenz verwendet.
Dadurch erscheint der Objekt-Name (namespace-Bezeichner) lediglich einmal und kann bei Anpassungen an
Bibliotheken leicht geändert werden.
Aber bei der Verwendung der this-Referenz sind u.U. schwer durchschaubare (destruktive) Code-Manipulationen möglich.
Code Snippet: Object Literal Notation
- <script>
- var obj2 = {
- anz: 0,
- div: function () {
- return window.document.getElementById("SPAN2");
- },
- reset: function () {
- this.anz = 0; //obj2.anz = 0;
- },
- add: function (x) {
- x = x || 1; this.anz += x; //obj2.anz += x;
- },
- show: function () {
- this.div().innerHTML = this.anz; //obj2.div().innerHTML = obj2.anz;
- }
- };
- </script>
-
- <a href="javascript:obj2.reset()"> reset() </a> |
- <a href="javascript:obj2.add()" >add() </a> |
- <a href="javascript:obj2.show()" >show() </a> ==> <span id="SPAN2"></span>
Teste:
reset() |
add() |
show() ==>
- Module Pattern
Beispiel 3
-
Das nachfolgende Muster verwendet.
eine "anonym-kapselnde" Funktion (function wrapper),
die bei der Ausgeführung ein Objekt obj3 erstellt und dieses zurück gibt.
Typischwerweise wird das Objekt während dem Laden der Seite erstellt.
Der Funktionsbereich der Wrapper-Funktion entspricht dem Sichtbarkeitsbereich der inneren Variablen.
Dadurch sind alle Variablen, die nicht im return-Objekt definiert werden funktionsintern, d.h. privat.
Code Snippet: Module Pattern
- <script>
- var obj3 = (function () { // privat sind anz, div
- var anz = 0,
- div = function () {
- return window.document.getElementById("SPAN3");
- };
-
- return { // public sind reset, add, show
- reset: function () {
- anz = 0;
- },
- add: function (x) {
- x = x || 1; anz += x;
- },
- show: function () {
- div().innerHTML = anz;
- }
- }; // ende return
-
- } ());
- </script>
Teste:
reset() |
add() |
show() ==>
- Namespace Argument
Beispiel 4
-
Nachfolgend wird beim Aufruf der anonymen Wrapper-Funktion
mit o = obj4 der gewünschte Namespace (Objektname) übergeben.
Die inneren Variablen anz
und win
sind privat.
Globale ( an window gebundene) Funktionen
reset()
, add()
, show()
werden z.B. infolge der Parameter
(window
,window
), d.h. infolge von
(function (win, o) { ... })(window,window);
erstellt.
Code Snippet
- <script>
- var obj4 = {};
-
- (function (win, o) { // privat sind anz und win
- var anz = 0,
- div = function () {
- return win.document.getElementById("SPAN4");
- };
- o.reset = function ( ) { anz = 0; };
- o.add = function (x) { x = x || 1; anz += x; };
- o.show = function ( ) { div().innerHTML = anz; };
- })(window, obj4);
-
- </script>
-
- <a href="javascript:obj4.reset()"> reset() </a> |
- <a href="javascript:obj4.add()" >add() </a> |
- <a href="javascript:obj4.show()" >show() </a> ==> <span id="SPAN4"></span>
Teste:
reset() |
add() |
show() ==>
- Namespace Proxy (.apply)
Beispiel 5
-
Im folgenden werden die Aufrufwerte
this
und ein Argument-Array
an die anonyme Funktion mit Hilfe von
.apply(obj5, [window])
übergeben.
Der Namespace wird über das Schlüsselwort
this
gebunden.
Der Zugriff auf die Arrayelemente des Applay-Aufrufparameters
erfolgt innerhalb der Funktion
mit
arguments
.
Code Snippet: Namespace Proxy (.apply)
- <script>
- var obj5 = {};
-
- (function () { // privat sind anz, arguments
- var anz = 0, win = arguments[0],
- div = function () {
- return win.document.getElementById("SPAN5");
- };
- this.reset = function ( ) { anz = 0; };
- this.add = function (x) { x = x || 1; anz += x; };
- this.show = function ( ) { div().innerHTML = anz; };
- }.apply(obj5, [window]));
-
- </script>
-
- <a href="javascript:obj5.reset()"> reset() </a> |
- <a href="javascript:obj5.add()" >add() </a> |
- <a href="javascript:obj5.show()" >show() </a> ==> <span id="SPAN5"></span>
Teste:
reset() |
add() |
show() ==>
- Kontex und Argument-Separation (.call)
Beispiel 6
-
Im folgenden wird
erzeugt ein call-Aufruf (User-Object, id-String, window-Referenz)
von
build.call()
der Erzeugung eines User-Objektes.
Infolge des Aufrufes
build.call(obj6, 'SPAN6', this);
wird in der build-Funktion
this
durch obj6
,
id
durch 'SPAN6'
und
win
durch window
ersetzt.
Code Snippet: Kontex und Argument-Separation (.call)
- <script>
- var obj6 = {},
- obj7 = {};
-
- var build = function (id, win) { // privat sind anz, id, win, div
- var anz = 0,
- div = function () {
- return win.document.getElementById(id);
- };
- this.reset = function ( ) { anz = 0; };
- this.add = function (x) { x = x || 1; anz += x; };
- this.show = function ( ) { div().innerHTML = anz; };
- };
-
- build.call(obj6, 'SPAN6', this);
- build.call(obj7, 'SPAN7', this);
- </script>
- <a href="javascript:obj6.reset()"> obj6.reset() </a> |
- <a href="javascript:obj6.add()"> obj6.add() </a> |
- <a href="javascript:obj6.show()" > obj6.show() </a> ==> <span id="SPAN6"></span><br />
- <a href="javascript:obj7.reset()"> obj7.reset() </a> |
- <a href="javascript:obj7.add()"> obj7.add() </a> |
- <a href="javascript:obj7.show()" > obj7.show() </a> ==> <span id="SPAN7"></span>
Teste:
obj6.reset() |
obj6.add() |
obj6.show() ==>
Teste:
obj7.reset() |
obj7.add() |
obj7.show() ==>