Búsqueda de sitios web

javascript - TypeError cuando la clase tiene un miembro estático `name`


Tengo la siguiente clase de TypeScript

module Test {
    "use strict";

    class Foo {
        public static name = "foo";
    }
}

Bastante simple.

Pero cuando lo ejecuto en Chrome obtengo el siguiente error:

TypeError no capturado: No se puede asignar a la propiedad de solo lectura 'name' de la función 'function Foo() { }'

Aquí está el javascript generado:

var Test;
(function (Test) {
  "use strict";
  var Foo = (function () {
    function Foo() {
    }
    Foo.name = "foo";
    return Foo;
  }());
})(Test || (Test = {}));

Si uso un nombre diferente a name, no recibo un error.

module Test {
    "use strict";

    class Foo {
        public static huh = "foo";
    }
}

¿Qué está pasando?

Respuesta #1

El problema parece ser que estás intentando escribir en Function.name. En el código que escribiste inicialmente, puedes ver en el código compilado que estás cambiando Foo.name.

Considera solo este código

  function Foo(){}
  console.log(Foo.name); // prints 'Foo'

El error se debe a que estás intentando cambiar la propiedad de esta función, y no se te permite hacerlo (propiedad de solo lectura ..). Más información sobre por qué (y cómo) no se te permite hacerlo se puede encontrar aquí. Gracias a @ssube por proporcionar este enlace en los comentarios

Así que, aunque no hayas creado esa propiedad tú mismo, todas tus funciones en realidad la tienen. Puedes consultar esta página para obtener más información.

Respuesta #2

el problema es Foo.name="foo"; porque name es una propiedad predefinida de las funciones en JavaScript (como arguments, length y otras), que contiene el nombre de la función ('Foo' en tu caso), por lo que no puedes sobrescribirla con tu propia definición

echa un vistazo en MDN de Mozilla para más detalles

Artículos relacionados