Three.js: Fehler Function.prototype.name im Internet Explorer

Erstellt am 27. Sept. 2017  ·  3Kommentare  ·  Quelle: mrdoob/three.js

Beschreibung des Problems

Ich verwende THREE in einem Aurelia-CLI-Projekt. Dies bedeutet, dass es mithilfe von Modulen und RequireJS geladen wird. Es funktioniert alles gut, außer im Internet Explorer (getestet in IE 11).

Der Code, der unterbrochen wird , ist der folgende (im Polyfill-Abschnitt oben, Zeilen 42-57) in der Datei

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 ];

    }

  } );

}

Es gibt den Fehler can't redefine non-configurable property "name" .

Nach diesem Beitrag habe ich versucht, den obigen Code durch Folgendes zu ersetzen:

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

Und es behebt das Problem!

=> Es scheint, dass der derzeit in /build/three.js verwendete Polyfill-Code nicht gut funktioniert. Ist es möglich, diesen Code für zukünftige Builds zu ersetzen?

Three.js-Version
  • [ ] Dev
  • [x] r87
  • [ ] ...
Browser
  • [ ] Alle von ihnen
  • [ ] Chrom
  • [ ] Feuerfuchs
  • [x] Internet-Explorer
Betriebssystem
  • [ ] Alle von ihnen
  • [ ] Fenster
  • [x] macOS
  • [ ] Linux
  • [ ] Android
  • [ ] iOS
Bug

Hilfreichster Kommentar

Ich bestätige, dass nur das Ändern von if ausreicht.

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

es ist der richtige Weg!

Alle 3 Kommentare

Würde eine Änderung des Schecks einen Unterschied machen?

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

Oder

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

Ich bestätige, dass nur das Ändern von if ausreicht.

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

es ist der richtige Weg!

Fest. Vielen Dank!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen