J.B. Dadet DIASOLUKA Luyalu Nzoyifuanga J AVA S C R I P T (Programmation Internet) V O L . I X +243 - 851278216 - 899508675 - 995624714 - 902263541 - 813572818 La dernière révision de ce texte est disponible sur CD. CHAPITRE 16 : Format (Représentation) Interne des objets en JavaScript, avec la commande Object.getOwnPropertyDescriptors (object) : La commande Object.getOwnPropertyDescriptors (object) liste les attributs [propres] ou descripteurs d’un objet. Quand nous créons un objet, les propriétés de cet objet sont en fait, à l’instar du prototype, des objets ayant leurs propres propriétés appelées ici ATTRIBUTS, ses attributs comportant chacune à leur tour ses propres propriétés suivantes et les mêmes pour tous les attributs : value (en fait la valeur de la propriété), writable, enumerable, configurable. Rappelons que le prototype est une propriété particulière (pas comme les autres) qui renferme les propriétés disponibles pour l’objet, mais aussi partageables avec et héritables par ses fils, alors que les propriétés ordinaires (non conte- J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX nues dans le prototype et définies directement dans le corps de l’objet) ne sont pas héritables. Le prototype renferme donc l’ensemble de propriétés intrinsèques communes à l’objet en cours, et ses descendants. Cependant, les propriétés propres du constructeur définies lors de sa « définition » sont toutes héritables, mais ses variables locales ne le sont pas. De même, si on redirige le prototype du constructeur vers un autre objet (ou fonction), le prototype des instances de ce constructeur créées sous l’ancien prototype continueront à pointer le prototype du constructeur qui était en cours lors de la construction/création de ces instances. Ces instances ne reconnaîtront pas le nouveau prototype. Tandis que les instances créées après redirection du prototype du constructeur pointeront ce nouveau prototype et ne reconnaîtront pas l’ancien prototype. On ne peut pas accéder aux propriétés propres d’un constructeur (dans le sens qu’elles n’appartiennent pas à son prototype) via le nom du constructeur (nom_constructeur.property) quand ces propriétés ont été définies dans le corps de définition du constructeur. Format Interne des objets - 2 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX Mais les propriétés propres d’un constructeur définies en dehors de son corps de définition sont accessibles via le nom de ce constructeur (nom_constructeur.property). Une instance n’hérite jamais d'une variable locale de son constructeur. Une instance n’hérite pas d'une propriété non ajoutée au constructeur via le prototype en cours. Ce genre de propriétés sont des propriétés propres (non partageable ni héritable) du constructeur. Le prototype étant un objet à part entière, la création/redirection d’un nouveau prototype DOIT se faire avec l’opérateur « new ». (voyez l’exemple à la fin de cet exposé chapitre XIII p. 22). Format Interne des objets - 3 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu I. JavaScript Tome-IX Format de stockage interne d’une String : Nous scannerons d’abord la représentation interne d’un objet String (chaîne [de caractères]). Un objet String (chaîne [de caractères]) est représenté internement sous forme d’une Array (tableau monodimensionnelle) dont les indices vont de zéro à n-1, n étant la taille (length ou nombre de caractères) de la chaîne. <script type="text/javascript"> "use strict"; // Avec “ var ” var stgv = "La filaire qui rend aveugle !"; console.log(stgv); // La filaire qui rend aveugle ! console.log(Object.getOwnPropertyDescriptors(stgv)); // Object { 0: {…}, 1: {…}, 2: {…}, 3: {…}, 4: {…}, 5: {…}, 6: {…}, 7: {…}, 8: {…}, 9: {…}, … } /* 0: {value: "L", writable: false, enumerable: true, configurable: false} 1: {value: "a", writable: false, enumerable: true, configurable: false} 2: {value: " ", writable: false, enumerable: true, configurable: false} 3: {value: "f", writable: false, enumerable: true, configurable: false} 4: {value: "i", writable: false, enumerable: true, configurable: false} 5: {value: "l", writable: false, enumerable: true, configurable: false} 6: {value: "a", writable: false, enumerable: true, configurable: false} 7: {value: "i", writable: false, enumerable: true, configurable: false} 8: {value: "r", writable: false, enumerable: true, configurable: false} Format Interne des objets - 4 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 9: {value: "e", writable: false, enumerable: true, configurable: false} 10: {value: " ", writable: false, enumerable: true, configurable: false} 11: {value: "q", writable: false, enumerable: true, configurable: false} 12: {value: "u", writable: false, enumerable: true, configurable: false} 13: {value: "i", writable: false, enumerable: true, configurable: false} 14: {value: " ", writable: false, enumerable: true, configurable: false} 15: {value: "r", writable: false, enumerable: true, configurable: false} 16: {value: "e", writable: false, enumerable: true, configurable: false} 17: {value: "n", writable: false, enumerable: true, configurable: false} 18: {value: "d", writable: false, enumerable: true, configurable: false} 19: {value: " ", writable: false, enumerable: true, configurable: false} 20: {value: "a", writable: false, enumerable: true, configurable: false} 21: {value: "v", writable: false, enumerable: true, configurable: false} 22: {value: "e", writable: false, enumerable: true, configurable: false} 23: {value: "u", writable: false, enumerable: true, configurable: false} 24: {value: "g", writable: false, enumerable: true, configurable: false} 25: {value: "l", writable: false, enumerable: true, configurable: false} 26: {value: "e", writable: false, enumerable: true, configurable: false} 27: {value: " ", writable: false, enumerable: true, configurable: false} 28: {value: "!", writable: false, enumerable: true, configurable: false} length: {value: 29, writable: false, enumerable: false, configurable: false} __proto__: Object */ Format Interne des objets - 5 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX ///////////////////////////////////////////// // Avec “ let ” let stgl = "La filaire qui rend aveugle !"; console.log(stgl); // La filaire qui rend aveugle ! console.log(Object.getOwnPropertyDescriptors(stgl)); // Object { 0: {…}, 1: {…}, 2: {…}, 3: {…}, 4: {…}, 5: {…}, 6: {…}, 7: {…}, 8: {…}, 9: {…}, … } /* 0: {value: "L", writable: false, enumerable: true, configurable: false} 1: {value: "a", writable: false, enumerable: true, configurable: false} 2: {value: " ", writable: false, enumerable: true, configurable: false} 3: {value: "f", writable: false, enumerable: true, configurable: false} 4: {value: "i", writable: false, enumerable: true, configurable: false} 5: {value: "l", writable: false, enumerable: true, configurable: false} 6: {value: "a", writable: false, enumerable: true, configurable: false} 7: {value: "i", writable: false, enumerable: true, configurable: false} 8: {value: "r", writable: false, enumerable: true, configurable: false} 9: {value: "e", writable: false, enumerable: true, configurable: false} 10: {value: " ", writable: false, enumerable: true, configurable: false} 11: {value: "q", writable: false, enumerable: true, configurable: false} 12: {value: "u", writable: false, enumerable: true, configurable: false} 13: {value: "i", writable: false, enumerable: true, configurable: false} 14: {value: " ", writable: false, enumerable: true, configurable: false} Format Interne des objets - 6 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 15: {value: "r", writable: false, enumerable: true, configurable: false} 16: {value: "e", writable: false, enumerable: true, configurable: false} 17: {value: "n", writable: false, enumerable: true, configurable: false} 18: {value: "d", writable: false, enumerable: true, configurable: false} 19: {value: " ", writable: false, enumerable: true, configurable: false} 20: {value: "a", writable: false, enumerable: true, configurable: false} 21: {value: "v", writable: false, enumerable: true, configurable: false} 22: {value: "e", writable: false, enumerable: true, configurable: false} 23: {value: "u", writable: false, enumerable: true, configurable: false} 24: {value: "g", writable: false, enumerable: true, configurable: false} 25: {value: "l", writable: false, enumerable: true, configurable: false} 26: {value: "e", writable: false, enumerable: true, configurable: false} 27: {value: " ", writable: false, enumerable: true, configurable: false} 28: {value: "!", writable: false, enumerable: true, configurable: false} length: {value: 29, writable: false, enumerable: false, configurable: false} __proto__: Object */ ///////////////////////////////////////////// // Avec “ const ” const stgc = "La filaire qui rend aveugle !"; console.log(stgc); // La filaire qui rend aveugle ! console.log(Object.getOwnPropertyDescriptors(stgc)); Format Interne des objets - 7 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX // Object { 0: {…}, 1: {…}, 2: {…}, 3: {…}, 4: {…}, 5: {…}, 6: {…}, 7: {…}, 8: {…}, 9: {…}, … } /* 0: {value: "L", writable: false, enumerable: true, configurable: false} 1: {value: "a", writable: false, enumerable: true, configurable: false} 2: {value: " ", writable: false, enumerable: true, configurable: false} 3: {value: "f", writable: false, enumerable: true, configurable: false} 4: {value: "i", writable: false, enumerable: true, configurable: false} 5: {value: "l", writable: false, enumerable: true, configurable: false} 6: {value: "a", writable: false, enumerable: true, configurable: false} 7: {value: "i", writable: false, enumerable: true, configurable: false} 8: {value: "r", writable: false, enumerable: true, configurable: false} 9: {value: "e", writable: false, enumerable: true, configurable: false} 10: {value: " ", writable: false, enumerable: true, configurable: false} 11: {value: "q", writable: false, enumerable: true, configurable: false} 12: {value: "u", writable: false, enumerable: true, configurable: false} 13: {value: "i", writable: false, enumerable: true, configurable: false} 14: {value: " ", writable: false, enumerable: true, configurable: false} 15: {value: "r", writable: false, enumerable: true, configurable: false} 16: {value: "e", writable: false, enumerable: true, configurable: false} 17: {value: "n", writable: false, enumerable: true, configurable: false} 18: {value: "d", writable: false, enumerable: true, configurable: false} 19: {value: " ", writable: false, enumerable: true, configurable: false} 20: {value: "a", writable: false, enumerable: true, configurable: false} Format Interne des objets - 8 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 21: {value: "v", writable: false, enumerable: true, configurable: false} 22: {value: "e", writable: false, enumerable: true, configurable: false} 23: {value: "u", writable: false, enumerable: true, configurable: false} 24: {value: "g", writable: false, enumerable: true, configurable: false} 25: {value: "l", writable: false, enumerable: true, configurable: false} 26: {value: "e", writable: false, enumerable: true, configurable: false} 27: {value: " ", writable: false, enumerable: true, configurable: false} 28: {value: "!", writable: false, enumerable: true, configurable: false} length: {value: 29, writable: false, enumerable: false, configurable: false} __proto__: Object */ </script> II. Format de stockage interne d’un littéral d’objet : Un littéral d’objet est un moyen rapide de définir un nouvel objet. <script type="text/javascript"> "use strict"; let obj = {article:"La", susbtantif:"filaire", conjonctif:"qui", verbe:"rend", cod:"aveugle", ponctuation:"!"}; console.log(obj); // Object { article: "La", susbtantif: conjonctif: "qui", verbe: "rend", cod: ponctuation: "!" } Format Interne des objets - 9 / 29 - "filaire", "aveugle", mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX /* article: "La" cod: "aveugle" conjonctif: "qui" ponctuation: "!" susbtantif: "filaire" verbe: "rend" __proto__: Object */ console.log(Object.getOwnPropertyDescriptors(obj)); // Object { article: {…}, susbtantif: {…}, conjonctif: {…}, verbe: {…}, cod: {…}, ponctuation: {…} } /* // AVEC FIREFOX : article: Object { value: "La", writable: true, enumerable: true, … } cod: Object { value: "aveugle", writable: true, enumerable: true, … } conjonctif: Object { value: "qui", writable: true, enumerable: true, … } ponctuation: Object { value: "!", writable: true, enumerable: true, … } susbtantif: Object { value: "filaire", writable: true, enumerable: true, … } verbe: Object { value: "rend", writable: true, enumerable: true, … } __proto__: Object { … } // AVEC YANDEX : article: {value: "La", writable: true, enumerable: true, configurable: true} cod: {value: "aveugle", writable: true, enumerable: true, configurable: true} conjonctif: {value: "qui", writable: true, enumerable: true, configurable: true} ponctuation: {value: "!", writable: true, enumerable: true, configurable: true} Format Interne des objets - 10 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX susbtantif: {value: "filaire", writable: true, enumerable: true, configurable: true} verbe: {value: "rend", writable: true, enumerable: true, configurable: true} __proto__: Object */ </script> III. Format de stockage interne d’une Array: Une Array est une collection indexée. <script type="text/javascript"> "use strict"; var arr = ["La", "filaire", "qui", "rend", "aveugle", "!"]; console.log(arr); // Array [ "La", "aveugle", "!" ] "filaire", "qui", "rend", /* (6) ["La", "filaire", "qui", "rend", "aveugle", "!"] 0: "La" 1: "filaire" 2: "qui" 3: "rend" 4: "aveugle" 5: "!" length: 6 __proto__: Array(0) */ console.log(Object.getOwnPropertyDescriptors(arr)); /* Format Interne des objets - 11 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX Object { 0: {…}, 1: {…}, 2: {…}, 3: {…}, 4: {…}, 5: {…}, length: {…} } 0: {value: "La", writable: true, enumerable: true, configurable: true} 1: {value: "filaire", writable: true, enumerable: true, configurable: true} 2: {value: "qui", writable: true, enumerable: true, configurable: true} 3: {value: "rend", writable: true, enumerable: true, configurable: true} 4: {value: "aveugle", writable: true, enumerable: true, configurable: true} 5: {value: "!", writable: true, enumerable: true, configurable: true} length: {value: 6, writable: true, enumerable: false, configurable: false} __proto__: Object */ </script> IV. Format de stockage interne d’un objet Date via l’opérateur « new » : Un objet Date sert à afficher et à manipuler les dates. <script type="text/javascript"> "use strict"; var dat = new Date("Friday, 1953 8 11"); console.log(dat.toUTCString()); // Mon, 10 Aug 1953 22:00:00 GMT console.log(Object.getOwnPropertyDescriptors(dat)); // Object { } /* {} __proto__: Object { … } Format Interne des objets - 12 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX */ </script> V. Format de stockage interne d’un objet Date sans l’opérateur « new » : ni plus ni moins une String. <script type="text/javascript"> "use strict"; var dat = Date("Friday, 1953 8 11"); console.log(dat.toLocaleString()); // Thu May 10 2018 08:43:29 GMT+0100 (Paris, Madrid) console.log(Object.getOwnPropertyDescriptors(dat)); // Object {0: {…}, 1: {…}, 2: {…}, 3: 5: {…}, 6: {…}, 7: {…}, 8: {…}, 9: {…}, {…}, 12: {…}, 13: {…}, 14: {…}, 15: {…}, {…}, 18: {…}, 19: {…}, 20: {…}, 21: {…}, {…}, 24: {…}, 25: {…}, 26: {…}, 27: {…}, {…}, 30: {…}, 31: {…}, 32: {…}, 33: {…}, {…}, 36: {…}, 37: {…}, 38: {…}, 39: {…}, {…}, 42: {…}, 43: {…}, 44: {…}, 45: {…}, {…}, 48: {…}, length: {…}} /* 0: {value: "T", writable: configurable: false} 1: {value: "h", writable: configurable: false} 2: {value: "u", writable: configurable: false} 3: {value: " ", writable: configurable: false} 4: {value: "M", writable: configurable: false} Format Interne des objets {…}, 4: {…}, 10: {…}, 11: 16: {…}, 17: 22: {…}, 23: 28: {…}, 29: 34: {…}, 35: 40: {…}, 41: 46: {…}, 47: false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, - 13 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 5: {value: "a", writable: configurable: false} 6: {value: "y", writable: configurable: false} 7: {value: " ", writable: configurable: false} 8: {value: "1", writable: configurable: false} 9: {value: "0", writable: configurable: false} 10: {value: " ", writable: configurable: false} 11: {value: "2", writable: configurable: false} 12: {value: "0", writable: configurable: false} 13: {value: "1", writable: configurable: false} 14: {value: "8", writable: configurable: false} 15: {value: " ", writable: configurable: false} 16: {value: "0", writable: configurable: false} 17: {value: "8", writable: configurable: false} 18: {value: ":", writable: configurable: false} 19: {value: "4", writable: configurable: false} 20: {value: "3", writable: configurable: false} 21: {value: ":", writable: configurable: false} 22: {value: "1", writable: configurable: false} 23: {value: "8", writable: configurable: false} 24: {value: " ", writable: configurable: false} 25: {value: "G", writable: configurable: false} 26: {value: "M", writable: configurable: false} 27: {value: "T", writable: configurable: false} Format Interne des objets false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, false, enumerable: true, - 14 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 28: {value: "+", writable: false, enumerable: true, configurable: false} 29: {value: "0", writable: false, enumerable: true, configurable: false} 30: {value: "1", writable: false, enumerable: true, configurable: false} 31: {value: "0", writable: false, enumerable: true, configurable: false} 32: {value: "0", writable: false, enumerable: true, configurable: false} 33: {value: " ", writable: false, enumerable: true, configurable: false} 34: {value: "(", writable: false, enumerable: true, configurable: false} 35: {value: "P", writable: false, enumerable: true, configurable: false} 36: {value: "a", writable: false, enumerable: true, configurable: false} 37: {value: "r", writable: false, enumerable: true, configurable: false} 38: {value: "i", writable: false, enumerable: true, configurable: false} 39: {value: "s", writable: false, enumerable: true, configurable: false} 40: {value: ",", writable: false, enumerable: true, configurable: false} 41: {value: " ", writable: false, enumerable: true, configurable: false} 42: {value: "M", writable: false, enumerable: true, configurable: false} 43: {value: "a", writable: false, enumerable: true, configurable: false} 44: {value: "d", writable: false, enumerable: true, configurable: false} 45: {value: "r", writable: false, enumerable: true, configurable: false} 46: {value: "i", writable: false, enumerable: true, configurable: false} 47: {value: "d", writable: false, enumerable: true, configurable: false} 48: {value: ")", writable: false, enumerable: true, configurable: false} length: {value: 49, writable: false, enumerable: false, configurable: false} __proto__: Object constructor: ƒ Object() Format Interne des objets - 15 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX hasOwnProperty: ƒ hasOwnProperty() isPrototypeOf: ƒ isPrototypeOf() propertyIsEnumerable: ƒ propertyIsEnumerable() toLocaleString: ƒ toLocaleString() toString: ƒ toString() valueOf: ƒ valueOf() __defineGetter__: ƒ __defineGetter__() __defineSetter__: ƒ __defineSetter__() __lookupGetter__: ƒ __lookupGetter__() __lookupSetter__: ƒ __lookupSetter__() get __proto__: ƒ __proto__() set __proto__: ƒ __proto__() */ </script> VI. Format de stockage interne d’une « variable numérique » : <script type="text/javascript"> "use strict"; var numv = 2018; console.log(numv); // 2018 console.log(Object.getOwnPropertyDescriptors(numv)); /* Object { } {} __proto__: Object { … } */ </script> VII. Format de stockage interne d’un « objet Number » avec l’opérateur « new » : Format Interne des objets - 16 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX <script type="text/javascript"> "use strict"; var numO = new Number( 2018 ); console.log(numO); // Number { 2018 } console.log(Object.getOwnPropertyDescriptors(numO)); /* Number {2018} __proto__: Number { 0 } [[PrimitiveValue]]: 2018 */ </script> VIII. Format de stockage interne d’un « objet Number » sans l’opérateur « new » : <script type="text/javascript"> "use strict"; var numO = Number( 2018 ); console.log(numO); // 2018 console.log(Object.getOwnPropertyDescriptors(numO)); /* {} __proto__: Object { … } */ </script> Format Interne des objets - 17 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu IX. JavaScript Tome-IX Format de stockage interne d’une variable « Boolean » : <script type="text/javascript"> "use strict"; var boolV = true; console.log(boolV); // true console.log(Object.getOwnPropertyDescriptors(boolV)); /* {} __proto__: Object { … } */ </script> X. Format de stockage interne d’une variable « Boolean » avec l’opérateur « new » : <script type="text/javascript"> "use strict"; var boolO = new Boolean(true); console.log(boolO); // Boolean { true } /* // AVEC FIREFOX Boolean __proto__: Boolean { false } // AVEC YANDEX Boolean {true} __proto__: Boolean [[PrimitiveValue]]: true */ Format Interne des objets - 18 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX console.log(Object.getOwnPropertyDescriptors(boolO)); // Object { } /* {} __proto__: Object { … } */ </script> XI. Format de stockage interne d’un « Boolean » sans l’opérateur « new » : <script type="text/javascript"> "use strict"; var boolO = Boolean(true); console.log(boolO); // true console.log(Object.getOwnPropertyDescriptors(boolO)); // Object { } /* {} __proto__: Object { … } */ </script> XII. Format de stockage interne d’un objet « Event » : <script type="text/javascript"> "use strict"; // Avec YANDEX : console.log(Event); Format Interne des objets - 19 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX // Event() { [native code] } console.log(Object.getOwnPropertyDescriptors(Event)); // {length: {…}, name: {…}, arguments: {…}, caller: {…}, prototype: {…}, …} /* AT_TARGET:{value: 2, writable: true, configurable: false} false, enumerable: BUBBLING_PHASE:{value: 3, writable: false, enumerable: true, configurable: false} CAPTURING_PHASE:{value: 1, writable: false, enumerable: true, configurable: false} NONE:{value: 0, writable: false, enumerable: true, configurable: false} arguments:{value: null, writable: false, enumerable: false, configurable: false} caller:{value: null, writable: false, configurable: false} false, enumerable: length:{value: 1, writable: false, enumerable: false, configurable: true} name:{value: "Event", writable: false, configurable: true} false, enumerable: prototype:{value: Event, writable: false, enumerable: false, configurable: false} __proto__:Object */ // Avec FIREFOX : console.log(Event); Format Interne des objets - 20 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX // function () /* () ALT_MASK: 1 AT_TARGET: 2 BUBBLING_PHASE: 3 CAPTURING_PHASE: 1 CONTROL_MASK: 2 META_MASK: 8 NONE: 0 SHIFT_MASK: 4 length: 1 name: "Event" prototype: EventPrototype { composedPath: composedPath(), stopPropagation: stopPropagation(), stopImmediatePropagation: stopImmediatePropagation(), … } Symbol(Symbol.hasInstance): undefined __proto__: function ()*/ console.log(Object.getOwnPropertyDescriptors(Event)); // Object { length: {…}, name: {…}, NONE: {…}, CAPTURING_PHASE: {…}, AT_TARGET: {…}, BUBBLING_PHASE: {…}, ALT_MASK: {…}, CONTROL_MASK: {…}, SHIFT_MASK: {…}, META_MASK: {…}, … } /* {…} ALT_MASK: Object { value: 1, writable: false, enumerable: true, … } AT_TARGET: Object { enumerable: true, … } value: 2, writable: false, BUBBLING_PHASE: Object { false, enumerable: true, … } value: 3, writable: CAPTURING_PHASE: Object { false, enumerable: true, … } value: 1, writable: Format Interne des objets - 21 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX CONTROL_MASK: Object { value: 2, writable: false, enumerable: true, … } META_MASK: Object { enumerable: true, … } value: 8, writable: false, NONE: Object { value: 0, writable: false, enumerable: true, … } SHIFT_MASK: Object { value: 4, writable: false, enumerable: true, … } length: Object { value: 1, writable: false, enumerable: false, … } name: Object { value: "Event", writable: false, enumerable: false, … } prototype: Object { writable: false, enumerable: false, configurable: false, … } Symbol(Symbol.hasInstance): Object { writable: false, enumerable: false, configurable: false, … } __proto__: Object { … } */ </script> XIII. Les règles concernant l’héritage et les prototypes. <script type="text/javascript"> "use strict"; // Fonction = objet (« fnprot ») qui // sera substituée au prototype natif. function fnprot(){ this.propNProt = "Propriété N Protot" } Format Interne des objets - 22 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX // Constructeur (=objet) cObj const cObj = function(){ this.nom = "ObjName"; this.date = new Date(); let vLocale = "« Var Locale de cObj »"; (function(){ console.log(vLocale) ; // Affiche « Var Locale de cObj » }()); } // Instanciation de iObj de cObj const iObj = new cObj(); // Les propriétés locales du constructeur // sont accessibles depuis l’instance // via l’identificateur « iObj » de l’instance. console.log(iObj.nom) // ObjName console.log(iObj.date) // Date 2018-05-10T10:01:53.924Z // // // // L’instance « iobj » a hérité des propriétés propres (dans le sens de « n’appartenant pas au prototype ») grâce à l’opérateur « this » dans la définition. // On ne peut pas accéder aux propriétés propres // d’un constructeur via son nom, en dehors // de son corps de description console.log(cObj.nom) //undefined console.log(cObj.date) //undefined // Pourtant les deux ont donné, via l’instance, // cfr plus haut. // On n’hérite jamais d'une VARIABLE locale. console.log(iObj.vLocale) // undefined Format Interne des objets - 23 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX // Ajout d’une nouvelle propriété au constructeur cObj.nvpropr="Nouvelle propriété"; // Affichons la nouvelle propriété du constructeur // « cObj » avec son instance « iObj » console.log(iObj.sage) // undefined // // // // Vous voyez, on ne peut pas hériter d'une propriété non ajoutée via le prototype en cours. = Propriétés propres (non partageables ni héritables) // Ajout d'une nouvelle propriété via // le PROTOTYPE par défaut cObj.prototype.nprotprop = "nvpropviaPrototype" // Enrichissement du prototype en cours. console.log(iObj.nprotprop) // nvpropviaPrototype // L’instance « iObj » a automatiquement // hérité la nouvelle propriété // "cObj.prototype.nprotprop" du prototype // Changeons ("redirigeons") le prototype // sur une autre fonction (objet). cObj.prototype = new fnprot() // // // // // // Les propriétés de l’ancien prototype (le prototype par défaut lors de la création) resteront visibles aux instances déjà créées et celles du nouveau prototype ne seront visibles qu'aux instances qui seront créées après la redirection. console.log(iObj.nprotprop) // nvpropviaPrototype Format Interne des objets - 24 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX // // // // // Les propriétés du prototype par défaut sont restées visibles car l'INSTANCE continue de pointer LE MÊME PROTOTYPE (ici le prototype par défaut) que LORS DE SA CRÉATION. // // // // // L'instance créée avant la redirection de prototype continuant de pointer l’ancien prototype que lors de sa création, le nouveau prototype du constructeur n'est pas reconnu par l'instance pré-existante. console.log(iObj.propNProt) // undefined // Créons une nouvelle instance de cObj, // le constructeur dont on a redirigé le // prototype. const iObj2 = new cObj(); // Les propriétés de l'ancien prototype // (p.e. la « nprotprop ») ne sont pas visibles // aux objets créés après redirection de prototype. console.log(iObj2.nprotprop) // undefined // // // // Les propriétés du nouveau prototype sont visibles par les instances du constructeur créées après redirection de son prototype vers le nouveau. console.log(iObj2.propNProt) // Propriété N Protot </script> Format Interne des objets - 25 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX Mots-clés : format interne, représentation interne, objets, getOwnPropertyDescriptors, propri é t é s, prototype, attributs, descripteurs, string, chaîne de caractères, length, Array, Tableau, unidimensionnel, monodimensionnel, Number, Boolean, Event mardi, 2. octobre 2018 (12:00 ). D’autres publications pouvant intéresser : • https://www.scribd.com/document/377036251/Le-DosageDes-Medicaments-en-Cac-Cas • https://www.scribd.com/document/377035454/Le-HasardDes-Thermometres-Non-contact-a-Infrarouge • https://www.scribd.com/document/376222482/PetiteIntroduction-Aux-Fonctions-JavaScript • https://www.scribd.com/document/376221919/La-Foi-enJesus-Christ-Pour-Quoi-Faire • https://www.scribd.com/document/375689778/Lacuitevisuelle-angulaire • https://www.scribd.com/document/375349851/La-variableThis • https://www.scribd.com/document/375024162/FonctionsImbriquees-en-JS Format Interne des objets - 26 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX • https://www.scribd.com/document/374789297/FormatInterne-Des-Objets-JavaScript • https://www.scribd.com/document/374788758/Iterations-enJavaScript • https://www.scribd.com/document/374738470/Le-PlusGrand-Secret-de-La-Creation • https://www.scribd.com/document/374597969/NouvelleFormule-d-IMC-indice-de-doduite-Selon-Dr-Diasoluka • https://www.scribd.com/document/373847209/PropertyDescriptors • https://www.scribd.com/document/373833282/l-ObjetGlobal-Window • https://www.scribd.com/document/372665249/JavascriptTome-II • https://www.scribd.com/document/355291488/motiliteoculaire-2 • https://www.scribd.com/document/355291239/motiliteoculaire-I • https://www.scribd.com/document/355290248/Script-dAnalyses-Des-Reflexes-Pupillomoteurs • https://www.scribd.com/document/321168468/Renseigneme nts-Id-et-Anthropometriques • https://www.scribd.com/document/320856721/Emission-31Jul-2016 • https://www.scribd.com/document/318182982/Complication -Visuelle-du-Traitement-de-La-Malaria Format Interne des objets - 27 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX • https://www.scribd.com/document/318180637/RapportEntre-Oxymetrie-Et-Type-Respiration • https://www.scribd.com/document/315746265/Classification -Des-Medicaments • https://www.scribd.com/document/315745909/Incongruence s-Heresies-et-Heterodoxies-de-la-Notion-de-Laboratoire • https://www.scribd.com/document/315745725/RapportEntre-Oxymetrie-Et-Type-Respiration Format Interne des objets - 28 / 29 - mardi, 2. octobre 2018 (12:00 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX DIASOLUKA Nz. Luyalu Docteur en Médecine, Chirurgie & Accouchements (1977), CNOM : 0866 - Spécialiste en ophtalmologie (1980) Études humanités : Scientifique - Mathématiques & Physique. Informaticien-amateur, Programmeur et WebMaster. Chercheur indépendant, autonome et autofinancé, bénévole, sans aucun conflit d’intérêt ou liens d'intérêts ou contrainte promotionnelle avec qui qu’il soit ou uelqu’organisme ou institution / organisation que ce soit, étatique, paraétatique ou privé, industriel ou commercial en relation avec le sujet présenté. +243 - 851278216 - 899508675 - 991239212 - 902263541 - 813572818 [email protected] Format Interne des objets - 29 / 29 - mardi, 2. octobre 2018 (12:00 )