JavaScript:如何在调用 new 后对 class 进行字符串化

JavaScript: How to stringify a class, after calling new

TL;DR: 我需要使用 executeJavaScript 将一些 JavaScript 注入 Electron 中的 BrowserView。此代码需要 class。如何将 class?

字符串化

我发现您可以使用 +.

对函数进行字符串化
const fn = function() {
  console.log('Hello');
};
const functionToText = '' + fn;
console.log(functionToText);
// function() {
//   console.log('Hello');
// }
*/

但我的问题是,如何将 classes 字符串化?我需要使用 new 从 class 创建的以下对象的字符串版本来注入它。

class Person {
  constructor({ name }) {
    this.getName = () => name;
  }
}
const person = new Person({ name: 'John'});
const str = // somehow stringify person here
console.log(str);
// the person object
view.webContents.executeJavaScript(`window.person = ${str}`);

编辑:

以下是我根据公认的答案最终实现它的方式:

view.webContents.executeJavaScript(
  `window.person = new ${str}({ name: 'John' })`
);

你的问题已经有了答案。 适用于函数的相同方法也适用于 类。

class Person {
  constructor({ name }) {
    this.getName = () => name;
  }
}
const str = '' + Person;
console.log(str);

已更新以回应相关的其他数据。 您不能序列化一个对象并使其跨越执行边界,因为此时它不再是数据,而是 运行 在内存中。

您可以采用的一种方法是调用 executeJavaScript

调用中的所有代码

例如:

view.webContents.executeJavaScript(`
class Person {
  constructor({ name }) {
    this.getName = () => name;
  }
}

window.person = new Person({name: 'John'});
`);

或者

view.webContents.executeJavaScript(`
(function() {
    class Person {
      constructor({ name }) {
        this.getName = () => name;
      }
    }

    window.person = new Person({name: 'John'});
})();
`);