Three.js: Bug de Function.prototype.name dans Internet Explorer

Créé le 27 sept. 2017  ·  3Commentaires  ·  Source: mrdoob/three.js

description du problème

J'utilise THREE dans un projet Aurelia-CLI. Cela signifie qu'il est chargé à l'aide de modules et de RequireJS. Cela fonctionne très bien sauf dans Internet Explorer (testé dans IE 11).

Le code qui casse est le suivant (dans la section polyfill en haut, lignes 42-57) dans le fichier /build/three.js

if ( Function.prototype.name === undefined ) {

  // Missing in IE
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name

  Object.defineProperty( Function.prototype, 'name', {

    get: function () {

      return this.toString().match( /^\s*function\s*([^\(\s]*)/ )[ 1 ];

    }

  } );

}

Il renvoie l'erreur can't redefine non-configurable property "name" .

Suite à ce post, j'ai essayé de remplacer le code ci-dessus par:

if (!(function f() {}).name) {
  Object.defineProperty(Function.prototype, 'name', {
    get: function() {
      var name = (this.toString().match(/^function\s*([^\s(]+)/) || [])[1];
      // For better performance only parse once, and then cache the
      // result through a new accessor for repeated access.
      Object.defineProperty(this, 'name', { value: name });
      return name;
    }
  });
}

Et ça résout le problème !

=> Il semble que le code polyfill actuellement utilisé dans /build/three.js ne fonctionne pas bien. Est-il possible de remplacer ce code pour les futures versions ?

Version trois.js
  • [ ] Dév
  • [x] r87
  • [ ] ...
Le navigateur
  • [ ] Tous
  • [ ] Chrome
  • [ ] Firefox
  • [x] Internet Explorer
Système d'exploitation
  • [ ] Tous
  • [ ] Les fenêtres
  • [x] macOS
  • [ ] Linux
  • [ ] Android
  • [ ] iOS
Bug

Commentaire le plus utile

Je confirme qu'il suffit de changer le if .

if ( 'name' in Function.prototype === false ) {

c'est la voie à suivre !

Tous les 3 commentaires

Changer le chèque en cela ferait-il une différence?

if ( 'name' in Function.prototype === false ) {

Ou alors

if ( Function.prototype.hasOwnProperty( 'name' ) === false ) {

Je confirme qu'il suffit de changer le if .

if ( 'name' in Function.prototype === false ) {

c'est la voie à suivre !

Fixé. Merci!

Cette page vous a été utile?
0 / 5 - 0 notes