2

你好!我有以下一小段 javascript:

let DynamicallyNamedClass = className => {
  let F = function() {
    this.v = 'hi';
  };
  Object.defineProperty(F, 'name', { value: className });
  return F;
};
let AmazingClass = DynamicallyNamedClass('AmazingClass');
let amazingInstance = new AmazingClass();
console.log(amazingInstance);

这里的输出或多或少有用取决于此代码是在 Node 中运行,还是在浏览器(chrome)中运行:

在 Nodeconsole.log中给了我非常好的输出:

>> AmazingClass { v: 'hi' }

在浏览器中,一点也不好看:

>> F {v: "hi"}

为什么浏览器(chrome)不在调试输出中显示这个动态命名类的名称?为什么好像不Object.defineProperty适用?我可以使用更丑陋的技术来显示动态类名:

let DynamicallyNamedClass = className => {
  return eval(
    `let FF = function ${className}() {` +
    `  this.v = 'hi';` +
    `};` +
    `FF;`
  );
};
let amazingInstance = new (DynamicallyNamedClass('AmazingClass'))();
console.log(amazingInstance); // Shows up nicely!

如果可以实现动态命名类,为什么要强制使用这种丑陋的方法?在调试输出中显示类的名称时,为什么不采用更接近 Node 使用的东西呢?这里有什么押韵或理由吗?

4

0 回答 0