ES6 class syntaxによって生成されたprototype上のunenumerableなメンバを列挙したかった…

class User {
  constructor(name, screenName, userId) {
    this.name = name;
    this.screenName = screenName;
    this.userId = userId;
  }
  get userPage() {
    return `https://twitter.com/${this.screenName}`;
  }
}

によって作られたUserインスタンスの配列をJSON.stringifyしてuserPageも含めてJSON化したい。

これは単一のオブジェクトに対してJSON.stringifyする場合と同値なので、それを考えると

let descriptor = Object.getOwnPropertyDescriptor(user, "userPage");
descriptor.enumerable = true;
Object.defineProperty(user, "userPage", descriptor);
JSON.stringify(user);

とすればいいかなと思うんですが、これではダメ。そもそもprototypeメンバの話なので違うのかなと思い

let descriptor = Object.getOwnPropertyDescriptor(User.prototype, "userPage");
descriptor.enumerable = true;
Object.defineProperty(User.prototype, "userPage", descriptor);
JSON.stringify(user);

としてもダメ、関係ないけど

user[Symbol.unscopables] = { userPage: false };
User.prototype[Symbol.unscopables] = { userPage: false };

でもダメ。当然JSON.stringifyで出来ないのでObject(user)してもダメ。

prototypeメンバからも列挙不可能なのでObject.keysとかでも拾えないので

  toObject() {
    return [...Object.keys(this), ...Reflect.ownKeys(this.constructor.prototype)].filter(key => key !== "constructor").reduce((obj, key) => {obj[key] = this[key]; return obj}, {});
  }

みたいな関数を生やすしかないっぽい気がしてきた。

これだったら受け側で新たにプロパティ生やしたほうが楽だなあとなり、厳しい。

一々定義時にプロパティを書かなくていいからgetter書いてたんだが、そういうわけにもいかないっぽい