0

すべての JavaScript クラスを Backbone モデルに変換中です。もともと、Google Chrome で Javascript デバッガーを使用すると、オブジェクトは type として表示されましたDataNode

これが前のコードサンプルです。

 var DataNode = { name: function() { return "hello world"; } };

バックボーン モデルに変換すると、デバッガーに として表示されますchild

Backbone モデルと同じことが行われます。

 var DataNode = Backbone.Model.extend({ name: function() { return "hello world"; } });

変数DataNodechrome を表示すると、タイプは以前childとは異なり、タイプはあると表示されますDataNode

これは、バックボーンのモデルから拡張されたすべてのオブジェクトで現在発生しています。たくさんのモデルがあると、どれがどれかわからないので、今はちょっと面倒です。

4

2 に答える 2

3

JS のクラス名の問題へようこそ。

実際に起こっていることは、実際にはクラスに名前がまったくないということです。この場合、ブラウザはログ オブジェクトに適切な名前を付けようとします。以前のように複雑なことを何もしない場合、つまり、クラスを作成してオブジェクトをインスタンス化する場合、ブラウザにはクラス名が表示されず、通常、クラスを含む var の名前が付けられます。

次のように考えたことがあるかもしれません:

var MyClass = function() {};

var MyClass = function MyClass() {};

は同じでした。あなたは間違っていました。2 番目の方法は、(私の知る限り) クラスに名前を付ける唯一の方法です。どちらの場合も試してください: console.log((new MyClass).constructor.name). 1 つ目は空の文字列を返し、2 つ目は MyClass を返します。

だまされてはいけません。「constructor.name を設定するだけ」と考えているかもしれません。コンストラクタ プロパティのすべての属性は保護されており、自分で設定することはできません。ここで問題です。Backbone でクラスを作成する方法では、クラス名を設定する方法が思い浮かびません (またはおそらく eval ですが、そうではありません)。

だから私が言いたいのは、あなたの大義は失われたということです。繰り返しますが、私は JS についてすべてを知っているわけではなく、何かが欠けている可能性があります。

If you're interested to learn more about the constructor property of functions: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function

于 2013-04-11T18:29:38.553 に答える