Pourquoi le code suivant ne fonctionne-t-il pas dans Internet Explorer (je n'ai testé que dans IE8 jusqu'à présent):
(function(){ this.foo = function foo(){}; foo.prototype = { bar:function(){ return 'bar'; } }; })(); var x = new foo; console.log(x.bar()) // Error: Object doesn't support this property or method
Si je change l'assignation de foo
à ce qui suit, le code fonctionne très bien:
var foo = this.foo = function(){};
J'imagine qu'il s'agit de fonctions nommées dans le moteur de JavaScript d'IE. Le code fonctionne bien dans Chrome et Firefox.
Des idées?
IE a beaucoup de problèmes avec les expressions de fonctions nommées. Comme vous l'avez dit dans votre question, respectez ceci:
this.foo = function (){};
Pour une lecture approfondie et épuisante sur ce sujet, consultez ce lien
Au bout de quoi, l'expression de la fonction nommée intérieure est traitée comme une déclaration de fonction, et est hissée jusqu'à des endroits où elle ne devrait jamais être jamais.
Dans IE, l'utilisation de foo.prototype
est "ambigieuse" car les identifiants NFE sont divulgués dans la portée contenant. Étant donné que le foo local filtré est plus proche que le foo mondial, foo.prototype
augmentera le foo
local, pas window.foo
.
Après avoir quitté la fonction extérieure, le local foo
est perdu et le foo
global n'a pas .prototype.bar
pour les raisons ci-dessus.
Vous pouvez résoudre l'ambiguïté en:
(function(){ this.foo = function foo(){}; this.foo.prototype = { bar:function(){ return 'bar'; } }; })(); var x = new foo; console.log(x.bar()) //"bar"