8

toJSONうまくいきませんが、プロトタイプ オブジェクトに列挙不可能な関数を定義しようとしています。ECMAScript 5 に似たものを期待していますtoJSON:

Object.defineProperty(obj, prop, { enumerable: false });

ただし、これはメソッドとしてアクセスできないプロパティとして定義します。
[編集: ニックは間違っています。メソッドとしてアクセスできます彼の間違いは、この質問には示されていないコードにありました。詳細については、以下の回答に関する彼のコメントを参照してください。]

複雑なオブジェクトを介して関数を再帰的に適用できるように、すべてのプリミティブ型 ( StringNumberBooleanArrayおよび)のプロトタイプで定義することを計画していたので、列挙不可能な方法で関数を定義できることを望んでいました。Object

ここでの最終目標は、ネストされたコレクションを含むバックボーン モデル/コレクションを再帰的に JSON 化できるようにすることです。

合計すると、2 つの主な質問があると思います。

  1. プロトタイプで列挙不可能な関数を定義することは可能ですか? もしそうなら、どのように?
  2. ネストされたバックボーン モデルを JSON 化するより良い方法はありますか?
4

3 に答える 3

16

よくわかりません。メソッドとしてアクセスできないのはなぜですか?

var foo = {};

Object.defineProperty(foo, 'bar', {
    enumerable: false,
    value: function () {console.log('foo.bar\'d!');}
});

foo.bar(); // foo.bar'd!

プロトタイプでそれが必要な場合は、次のように簡単です

Object.defineProperty(foo.prototype, /* etc */);

または直接Object.create

foo.prototype = Object.create(null, {
    'bar': {value: function () {/* ... */}}
});

ただし、 のインスタンスを作成していない限り、fooを実行しようとしても表示されfoo.bar、 としてのみ表示されfoo.prototype.barます。

foo独自のプロトタイプ (例: foo = Object.create({})) がある場合は、 で取得し 、Object.getPrototypeOfそれにプロパティを追加するとfoo.bar、インスタンスでなくても機能します。

var proto = Object.getPrototypeOf(foo); // get prototype
Object.defineProperty(proto, /* etc */);

ここで、列挙可能なプロパティと列挙できないプロパティの可視性を確認できます。

于 2013-07-03T02:13:06.187 に答える