Three.js: Error de Function.prototype.name en Internet Explorer

Creado en 27 sept. 2017  ·  3Comentarios  ·  Fuente: mrdoob/three.js

Descripción del problema

Estoy usando TRES en un proyecto Aurelia-CLI. Significa que se carga usando módulos y RequireJS. Todo funciona bien excepto en Internet Explorer (probado en IE 11).

El código que se rompe es el siguiente (en la sección de polyfill en la parte superior, líneas 42-57) en el archivo /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 ];

    }

  } );

}

Devuelve el error can't redefine non-configurable property "name" .

Después de esta publicación , intenté reemplazar el código anterior con:

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;
    }
  });
}

¡Y soluciona el problema!

=> Parece que el código polyfill que se usa actualmente en /build/three.js no funciona bien. ¿Es posible reemplazar este código para futuras compilaciones?

Versión Three.js
  • [] Desarrollo
  • [x] r87
  • [] ...
Navegador
  • [ ] Todos ellos
  • [ ] Cromo
  • [] Firefox
  • [x] Internet Explorer
SO
  • [ ] Todos ellos
  • [] Windows
  • [x] macOS
  • [] Linux
  • [] Android
  • [] iOS
Bug

Comentario más útil

Confirmo que solo cambiar if es suficiente.

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

es el camino a seguir!

Todos 3 comentarios

¿Cambiaría el cheque por este?

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

O

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

Confirmo que solo cambiar if es suficiente.

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

es el camino a seguir!

Reparado. ¡Gracias!

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

clawconduce picture clawconduce  ·  3Comentarios

Horray picture Horray  ·  3Comentarios

boyravikumar picture boyravikumar  ·  3Comentarios

Bandit picture Bandit  ·  3Comentarios

makc picture makc  ·  3Comentarios