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?
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!
Hilfreichster Kommentar
Ich bestätige, dass nur das Ändern von
if
ausreicht.es ist der richtige Weg!