Algorithmes fonctionnels en javascript sous la forme de cours et d'exercices. Utilisation de js dans un contexte de liste, de map, list_it. Inspiré de caml. A lire à l'envers...

samedi 2 novembre 2013

Introspection en javascript

Comment examiner un objet en javascript: 

On peut appeler cela de l'introspection, c'est à dire l'étude de soi … ou plus simplement de l'inspection.

 1/ Quel est  type parmi les 6 types possibles en javascript:  typeof :

typeof  "hello"   ; //string
typeof  (new Date())  ; // objet
typeof jenexistepas  ; //undefined
typeof 5.5   ; // number
typeof (1===1) ; //boolean
typeof alert ; // function

2/ Si c'est un objet quel est  sa classe ?  Instanceof

Exemple : 
var maintenant = new Date() ; 
maintenant instance of Date  ;  // true
maintenant instance of Object ; // true  
alert instance of Object  ;  // true
alert instance of Function  ;  // true
alert instance of function  ;   // Erreur … 
Mais il n'existe pas la fonction getInstanceof … 


3/ Utilisation de la syntaxe for var i in objet :

Parfois il est nécessaire de connaître et énumérer les éléments qui constitue un objet en javascript : 
La syntaxe for(var element in objet ) permet d'explorer l'objet  et d'en énumérer les propriétés:

var o = {"Hello" : "moi", "DitHello": function(){ alert("hello")}


for(var i in o){
     console.log(i, o[i])
}

//hello moi
//SayHello function () {alert("hello");}



Mais cette forme est insuffisante, on ne peut pas aller plus loin avec par exemple  :
for(var i in String.prototype ){
    console.log(i , String.prototype[i] );
}
Cela ne marche pas!
Il faut donc une méthode plus complète d'inspection …

4/ Méthodes getOwnPropertyNames, getPrototypeOf et hasOwnProperty

Ces trois méthodes permettent de mieux explorer l'objet: les deux premières sont des méthodes de la classe "Object" la dernière est applicable à tout élément:
La methode Object.getOwnPropertyNames( deUnObjet ) permet d'énumérer complètement toutes les propriété d'un objet javascript.

Exemple: 
//exploration d'un tableau o:
clear();
var o= [0,1,2];
var path= "this";

while (o) {
  Object.getOwnPropertyNames(o).forEach(function (key) {
    console.log(path+ "."+ key);
  });
  path+= ".__proto__";
  o= o.__proto__;
}
Voir discussion sur le thème des propriétés d'un objet en javascript sur google groups.