Bonjour à tous,
Je viens du C/C++ et essaye de comprendre l'équivalent des classes par l'emploi de prototype et de classes immédiates en particulier.
Je dois créer mes propres objets pour une application et cherche la meilleur façon de le faire. J'ai ici 2 template de 'classe' que j'ai extrait de classes de Three.js que j'utilise actuellement. Ils semblent structurés différemment, hormis le fait que l'un intègre la gestion des événements.
Si quelqu'un avait un peu de temps pour faire le tour de ces deux template. Vous trouverez mes questions plus particulières en dessous de chaque bloc.
Q: Il y a là 3 types de fonctions et je souhaiterais comprendre quel est leur usage typique et dans quel situation je devrais moi aussi créer ce type de fonction
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 ClassName = function ( param, domElement ) { var _this = this; this.param = param; this.domElement = ( domElement !== undefined ) ? domElement : document; // API this.apivar = 1.0; // internals var _internalVar = true; //dispatchEvents var changeEvent = { type: 'change' }; //methods this.firstMethod = function () { }; this.secondMethod = ( function() { var intern = true; return function secondMethod() { }; }() ); var immediateVar = ( function () { var intern = true; return function immediateVar( param ) { param = false; return param; }; }() ); // events function mouseup( event ) { if ( _this.enabled === false ) return; event.preventDefault(); event.stopPropagation(); document.removeEventListener( 'mousemove', mousemove ); document.removeEventListener( 'mouseup', mouseup ); _this.dispatchEvent( changeEvent ); } this.dispose = function() { this.domElement.removeEventListener( 'contextmenu', contextmenu, false ); document.removeEventListener( 'mousemove', mousemove, false ); window.removeEventListener( 'keydown', keydown, false ); }; this.domElement.addEventListener( 'contextmenu', contextmenu, false ); window.addEventListener( 'keydown', keydown, false ); }; ClassName.prototype = Object.create( ClassName.prototype ); ClassName.prototype.constructor = ClassName;
- firstMethod déclarée simplement
- secondMethod est une fonction immédiate mais dont le retour est affecté au nom d'une fonction
- thirdMethod est une fonction immédiate mais dont le retour est affecté à un nom de variable
Q: Quelle est la raison d'être de cette ligne exactement ? Est-ce l'équivalent de Object.assign( ClassName.prototype,... du second template ci-après ?
ClassName.prototype = Object.create( ClassName.prototype );
Q: Est-ce que thirdFunction n'est pas inclue dans le bloc Prototype par ce qu'elle n'a pas besoin d'être héritée?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 ( function () { ClassName = function (){ }; Object.assign( ClassName.prototype, { firstMethod: function (param) { }, secondMethod: function (param) { } }); function thirdFunction (param) { return param; } function FourthFunction () { Object.assign ( FourthFunction.prototype, { fifthFunction: function () { } }); } }) ();
Q: Pourquoi fifthFunction est-elle imbriquée ainsi, quel en est l'usage ? Comment l'appelle t-on ?
Merci par avance pour le temps passé à décortiquer ces deux squelettes !
Badoumba
Partager