2013-07-03 10 views
5

プロトタイプオブジェクトに列挙できない数値のtoJSON関数をあまり定義しません。しかし、これはメソッドとしてアクセスすることはできませんプロパティとしてそれを定義JS非列挙型関数

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

:私はECMAScriptの5 toJSONに似た何かを願っています。

私はすべてのプリミティブ型(StringNumberBooleanArray、およびObject)のプロトタイプに定義することを計画していたように私がするように私は、非可算な方法で関数を定義することができるように期待していました複雑なオブジェクトを通して関数を再帰的に適用することができます。

ここでの最終目標は、ネストされたコレクションを含むバックボーンモデル/コレクションを再帰的にJSONifyすることです。私は合計で私は2つの主要な質問があると思い

  1. は、プロトタイプに非列挙関数を定義することは可能ですか?もしそうなら、どのように?
  2. ネストされたBackboneモデルをJSONifyするより良い方法はありますか?
+0

メソッドは*オブジェクトのプロパティです*。あなたは存在しない区別を描いています。あなたがそれを列挙できないようにするには、明らかにオブジェクトのプロパティを列挙しています。 –

+0

はい、私はObject.definePropertyが列挙できないのと同じ方法で、非列挙型プロパティにしたいと思います。つまり、 'for(x in obj) 'を使用したときに反復されません。 –

+0

右。ここでも、メソッドは、関数を参照するオブジェクトのプロパティです。あなたが持っているコードは、プロパティを列挙できないようにするために使うものです。 –

答えて

13

私はそれを得ることができません、どうしてあなたは方法としてそれにアクセスできませんか?

var foo = {}; 

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

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

あなたはプロトタイプでそれを望んでいた場合は、fooのインスタンスを作成している場合を除き、それは、しかし

Object.create

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

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

あるいは直接のと同じくらい簡単ですが、それはfoo.barを試してみるとが表示され、foo.prototype.barと表示されます。

fooはそれが自身のプロトタイプ(例えばfoo = Object.create({}))のしている場合、あなたは、Object.getPrototypeOfでそれを得ることにプロパティを追加し、その後foo.barことができ、それがインスタンスでない場合でも動作します。

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

visibility of enumerable vs non-enumerable properties hereが表示されます。

+0

素晴らしい、ありがとう!問題は、私が関数としてアクセスすることができなかった 'value'の代わりに' get'を使用していたことでした。 –

+0

_get_引数を渡さずに_function_を呼び出し、そのプロパティが関数の 'return'と同じであるとふりをしているので、' SJON(args) 'を実行するときに' SJON(args) 'を実行していた。 –

+0

Okay 。あなたが気にしないなら最後の1つの質問。このアプローチは、Enumerable関数を持つObjectプロトタイプを拡張するのと同じ問題を引き起こしますか? –

1

ポールS.は、プロパティ定義のvalue代わりgetのを設定する必要が権利についてですが、偽の答えができObject.defineProperty()にそのオプションのデフォルトですので、私は、あなたがenumerable: falseを渡す必要がないことを追加したいです

var foo = {};  

Object.defineProperty(foo, 'bar', { 
    value: function(){ console.log('calling bar!'); } 
}); 

foo.bar(); 
+0

ありがとう、私は質問に明快にするために明示的にしか含んでいませんでしたが、実際には必要ではないことを覚えておいてください。 –