javascript tome ix - Format (Représentation) interne des objets JavaScript
Transcription
javascript tome ix - Format (Représentation) interne des objets JavaScript
Formats / Représentation interne des Objets en J AVA S C R I P T (Programmation Internet) V O L . I X J.B. Dadet DIASOLUKA Luyalu Nzoyifuanga +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) : 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 contenues dans le prototype et définies directement dans le corps de l’objet) ne sont pas héritables. Le prototype renferme J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 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 / 31 - jeudi, 4. avril 2019 (10:49 ) 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). La commande Object.getOwnPropertyDescriptors (object) liste les attributs [propres] ou descripteurs d’un objet. 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. 24). Format Interne des objets - 3 / 31 - jeudi, 4. avril 2019 (10:49 ) 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} Format Interne des objets - 4 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 7: {value: "i", writable: configurable: false} 8: {value: "r", writable: configurable: false} 9: {value: "e", writable: configurable: false} 10: {value: " ", writable: configurable: false} 11: {value: "q", writable: configurable: false} 12: {value: "u", writable: configurable: false} 13: {value: "i", writable: configurable: false} 14: {value: " ", writable: configurable: false} 15: {value: "r", writable: configurable: false} 16: {value: "e", writable: configurable: false} 17: {value: "n", writable: configurable: false} 18: {value: "d", writable: configurable: false} 19: {value: " ", writable: configurable: false} 20: {value: "a", writable: configurable: false} 21: {value: "v", writable: configurable: false} 22: {value: "e", writable: configurable: false} 23: {value: "u", writable: configurable: false} 24: {value: "g", writable: configurable: false} 25: {value: "l", writable: configurable: false} 26: {value: "e", 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, - 5 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 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 “ 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} Format Interne des objets - 6 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 8: {value: "r", writable: configurable: false} 9: {value: "e", writable: configurable: false} 10: {value: " ", writable: configurable: false} 11: {value: "q", writable: configurable: false} 12: {value: "u", writable: configurable: false} 13: {value: "i", writable: configurable: false} 14: {value: " ", writable: configurable: false} 15: {value: "r", writable: configurable: false} 16: {value: "e", writable: configurable: false} 17: {value: "n", writable: configurable: false} 18: {value: "d", writable: configurable: false} 19: {value: " ", writable: configurable: false} 20: {value: "a", writable: configurable: false} 21: {value: "v", writable: configurable: false} 22: {value: "e", writable: configurable: false} 23: {value: "u", writable: configurable: false} 24: {value: "g", writable: configurable: false} 25: {value: "l", writable: configurable: false} 26: {value: "e", writable: configurable: false} 27: {value: " ", 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, - 7 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 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)); // 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 - 8 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 9: {value: "e", writable: configurable: false} 10: {value: " ", writable: configurable: false} 11: {value: "q", writable: configurable: false} 12: {value: "u", writable: configurable: false} 13: {value: "i", writable: configurable: false} 14: {value: " ", writable: configurable: false} 15: {value: "r", writable: configurable: false} 16: {value: "e", writable: configurable: false} 17: {value: "n", writable: configurable: false} 18: {value: "d", writable: configurable: false} 19: {value: " ", writable: configurable: false} 20: {value: "a", writable: configurable: false} 21: {value: "v", writable: configurable: false} 22: {value: "e", writable: configurable: false} 23: {value: "u", writable: configurable: false} 24: {value: "g", writable: configurable: false} 25: {value: "l", writable: configurable: false} 26: {value: "e", writable: configurable: false} 27: {value: " ", writable: configurable: false} 28: {value: "!", 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, - 9 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX length: {value: 29, writable: false, configurable: false} __proto__: Object */ </script> II. false, enumerable: 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: "!" } "filaire", "aveugle", /* article: "La" cod: "aveugle" conjonctif: "qui" ponctuation: "!" susbtantif: "filaire" verbe: "rend" __proto__: Object */ console.log(Object.getOwnPropertyDescriptors(obj)); Format Interne des objets - 10 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX // 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} susbtantif: {value: "filaire", writable: true, enumerable: true, configurable: true} verbe: {value: "rend", writable: true, enumerable: true, configurable: true} __proto__: Object */ </script> Format Interne des objets - 11 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu III. JavaScript Tome-IX Format de stockage interne d’une Array: Une Array est une collection itérable 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)); /* 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} Format Interne des objets - 12 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 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 { … } */ </script> Format Interne des objets - 13 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu V. JavaScript Tome-IX 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} 5: {value: "a", 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, false, enumerable: true, - 14 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 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} 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, - 15 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 26: {value: "M", writable: configurable: false} 27: {value: "T", writable: configurable: false} 28: {value: "+", writable: configurable: false} 29: {value: "0", writable: configurable: false} 30: {value: "1", writable: configurable: false} 31: {value: "0", writable: configurable: false} 32: {value: "0", writable: configurable: false} 33: {value: " ", writable: configurable: false} 34: {value: "(", writable: configurable: false} 35: {value: "P", writable: configurable: false} 36: {value: "a", writable: configurable: false} 37: {value: "r", writable: configurable: false} 38: {value: "i", writable: configurable: false} 39: {value: "s", writable: configurable: false} 40: {value: ",", writable: configurable: false} 41: {value: " ", writable: configurable: false} 42: {value: "M", writable: configurable: false} 43: {value: "a", writable: configurable: false} 44: {value: "d", writable: configurable: false} 45: {value: "r", 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, - 16 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 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() 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)); Format Interne des objets - 17 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX /* Object { } {} __proto__: Object { … } */ </script> VII. Format de stockage interne d’un « objet Number » avec l’opérateur « new » : <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 ); Format Interne des objets - 18 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX console.log(numO); // 2018 console.log(Object.getOwnPropertyDescriptors(numO)); /* {} __proto__: Object { … } */ </script> 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 » : Format Interne des objets - 19 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX <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 */ 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); Format Interne des objets - 20 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX // 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); // 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} Format Interne des objets - 21 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 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); // function () /* () ALT_MASK: 1 AT_TARGET: 2 BUBBLING_PHASE: 3 CAPTURING_PHASE: 1 CONTROL_MASK: 2 META_MASK: 8 Format Interne des objets - 22 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX 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: CONTROL_MASK: Object { value: 2, writable: false, enumerable: true, … } Format Interne des objets - 23 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu META_MASK: Object { enumerable: true, … } JavaScript Tome-IX 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 - 24 / 31 - jeudi, 4. avril 2019 (10:49 ) 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. Format Interne des objets - 25 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX // On n’hérite jamais d'une VARIABLE locale. console.log(iObj.vLocale) // undefined // 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) Format Interne des objets - 26 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu // // // // JavaScript Tome-IX 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 // // // // // 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 Format Interne des objets - 27 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX // vers le nouveau. console.log(iObj2.propNProt) // Propriété N Protot </script> 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 jeudi, 4. avril 2019 (10:49 ). D’autres publications pouvant intéresser : https://www.scribd.com/document/37703625 1/Le-Dosage-Des-Medicaments-en-CacCas https://www.scribd.com/document/37703545 4/Le-Hasard-Des-Thermometres-Noncontact-a-Infrarouge https://www.scribd.com/document/37622248 2/Petite-Introduction-Aux-FonctionsJavaScript Format Interne des objets - 28 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX https://www.scribd.com/document/37622191 9/La-Foi-en-Jesus-Christ-Pour-Quoi-Faire https://www.scribd.com/document/37568977 8/Lacuite-visuelle-angulaire https://www.scribd.com/document/37534985 1/La-variable-This https://www.scribd.com/document/37502416 2/Fonctions-Imbriquees-en-JS https://www.scribd.com/document/37478929 7/Format-Interne-Des-Objets-JavaScript https://www.scribd.com/document/37478875 8/Iterations-en-JavaScript https://www.scribd.com/document/37473847 0/Le-Plus-Grand-Secret-de-La-Creation https://www.scribd.com/document/37459796 9/Nouvelle-Formule-d-IMC-indice-dedoduite-Selon-Dr-Diasoluka https://www.scribd.com/document/37384720 9/Property-Descriptors https://www.scribd.com/document/37383328 2/l-Objet-Global-Window https://www.scribd.com/document/37266524 9/Javascript-Tome-II https://www.scribd.com/document/35529148 8/motilite-oculaire-2 https://www.scribd.com/document/35529123 9/motilite-oculaire-I Format Interne des objets - 29 / 31 - jeudi, 4. avril 2019 (10:49 ) J.D.B. DIASOLUKA Nz. Luyalu JavaScript Tome-IX https://www.scribd.com/document/35529024 8/Script-d-Analyses-Des-ReflexesPupillomoteurs https://www.scribd.com/document/32116846 8/Renseignements-Id-et-Anthropometriques https://www.scribd.com/document/32085672 1/Emission-31-Jul-2016 https://www.scribd.com/document/31818298 2/Complication-Visuelle-du-Traitement-deLa-Malaria https://www.scribd.com/document/31818063 7/Rapport-Entre-Oxymetrie-Et-TypeRespiration https://www.scribd.com/document/31574626 5/Classification-Des-Medicaments https://www.scribd.com/document/31574590 9/Incongruences-Heresies-et-Heterodoxiesde-la-Notion-de-Laboratoire https://www.scribd.com/document/31574572 5/Rapport-Entre-Oxymetrie-Et-TypeRespiration Format Interne des objets - 30 / 31 - jeudi, 4. avril 2019 (10:49 ) 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 - 31 / 31 - jeudi, 4. avril 2019 (10:49 )