指定.constructor.name为任意字符串

时间:2019-04-02 17:56:19

标签: javascript function constructor

我知道有一种方法可以使.constructor.name与构造函数存储在其中的变量不同

var Foo = function Bar() {};
console.log(new Foo().constructor.name) // => Bar

我想知道是否存在一种将对象的.constructor.name设置为不是有效JS函数名称(例如, "Hello::World"

直接设置似乎无效:

function Foo() {};
Foo.prototype.constructor.name = "Test"
console.log(new Foo().constructor.name) // => Foo

我尝试使用Function构造函数来执行此操作,但是它使用eval,因此JS尽管传递了字符串也必须有效。

1 个答案:

答案 0 :(得分:4)

prototype.constructor.name被定义为不可写的,这意味着您不能仅通过分配对其进行更改。

var Foo = function Bar() {};
console.log(Object.getOwnPropertyDescriptor(Foo.prototype.constructor, 'name'))

但是,如您所见,它是可配置的,这意味着您可以重新定义它。我不知道这是否明智,但您可以这样做:

var Foo = function Bar() {};

Object.defineProperty(Foo.prototype.constructor, 'name', {value: "Test"})
console.log(new Foo().constructor.name)  // Test