Timothée Groleau propose dans ce post une implémentation en ActionScript de l'instruction native instanceof. Il se trouve que cette implémentation a un comportement que je qualifierai de logique, mais qui n'est pas exactement le même que celui de l'instruction native ... 8|

En effet, instanceof ne renvoie pas true lorsque l'on a pas utilisé de constructeur pour les classes Number, String ou Boolean. Il ne considère donc pas que 10 est une instance de la classe Number. Pour pouvoir l'utiliser avec un nombre, il faut le caster en faisant Number(10), ce qui va automatiquement renvoyer true évidemment ... ;) Cela est sûrement dû à la manière dont Flash gère ces types de variables, mais malgré tout, c'est assez destabilisant ... 8|

L'implémentation de instanceof serait :myInstanceOf = function(obj, theClass) {
        if (!obj || !theClass.prototype) return false;
        var t = obj;
        do {
                if ((t = t.__proto__) == theClass.prototype) return true;
        } while (t != null);
        return false;
}
Voyons la différence de comportement entre les deux :var nb = 10;
trace("instanceof : " + (nb instanceof Number)); // instanceof : false
trace("prototypes : " + (nb.__proto__ == Number.prototype)); // prototypes : true
trace("myInstanceOf : " + myInstanceOf(nb, Number)); // myInstanceOf : true
Le pire est que même le fait de rajouter le typage fort ne modifie pas le comportement de instanceof.var nb:Number = 10;
trace("instanceof : " + (nb instanceof Number)); // instanceof : false
trace("prototypes : " + (nb.__proto__ == Number.prototype)); // prototypes : true
trace("myInstanceOf : " + myInstanceOf(nb, Number)); // myInstanceOf : true

En résumé, je précise au moment de la déclaration de la variable qu'elle est une instance de la classe Number, et instanceof me dit le contraire... 8O