类具有静态成员`name`时的TypeError

时间:2016-08-09 14:41:27

标签: javascript typescript

我有以下TypeScript类

module Test {
    "use strict";

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

非常简单。

但是在Chrome中运行时出现以下错误:

  

未捕获的TypeError:无法分配给只读属性' name'功能'功能Foo(){}'

这是生成的javascript:



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




如果我使用其他名称,那么name我就不会收到错误。

module Test {
    "use strict";

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

发生了什么事?

2 个答案:

答案 0 :(得分:5)

问题似乎是您正试图写信给Function.name。在您最初编写的代码中,您可以在已编译的代码中看到您正在更改Foo.name

只考虑这段代码

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

错误是因为您尝试更改此函数的属性,并且不允许这样做(read-only property ..)。有关您不被允许这样做的原因(以及如何)的更多信息可以在here找到。感谢@ssube在评论中提供此链接

因此,虽然您没有自己创建该属性,但您的所有功能确实拥有它。您可以查看this page以获取更多信息。

答案 1 :(得分:2)

问题是Foo.name = "foo";,因为 name 是javascript中函数的预定义属性(如 arguments length 等) ,其中包含函数的名称(在您的情况下为'Foo'),因此您无法使用自己的定义覆盖它

查看Mozilla's MDN了解详情