Spine のサブクラス化されたモデルに対して JSON.stringify を使用すると奇妙な動作が見られます。誰かが助けてくれることを願っています!
以下は、私たちのプロジェクトの 1 つで取得したコードからの簡単な抜粋です。
define([
"jquery",
"underscore"
],
function ($, _) {
var SuperClass = Spine.Model.sub();
SuperClass.configure("SuperClass", "SuperClassProperty");
var SubClass = SuperClass.sub();
SubClass.configure("SubClass", "SubClassProperty");
var instance = new SubClass({ SuperClassProperty: "Super", SubClassProperty: "Sub" });
console.log(instance);
var json = JSON.stringify(instance);
console.log(json);
});
「console.log(instance)」は、このシナリオで私が期待するものを正確に出力しています:
result
SubClassProperty: "Sub"
SuperClassProperty: "Super"
cid: "c-0"
__proto__: ctor
ただし、インスタンスに対して JSON.stringify を使用すると、これだけが返されます。
{"SubClassProperty":"Sub"}
SuperClassProperty が stringify に含まれないのはなぜですか?
JSON2 に Chrome のネイティブ JSON オブジェクトをオーバーライドさせることで、JSON.stringify メソッドの問題を除外しました。どちらの実装でも同じ結果が得られます。オブジェクトに「toJSON」関数がある場合、stringify はオブジェクトの「toJSON」関数に委譲するように見えます。この場合は (Spine の一部として)あります。
したがって、(a) これは Spine のバグであるか、(b) 何か間違ったことをしている可能性が高いオプションのいずれかのようです。
サブクラスのスーパークラス プロパティを再構成することで、この問題を回避できることはわかっています。
SubClass.configure("SubClass", "SuperClassProperty", "SubClassProperty");
ただし、これは直感に反するように思えます (サブクラス化のポイントは何ですか?) ので、それが答えではないことを願っています。
更新: Spine ソース コードを使用していくつかのデバッグを行いましたが、サブクラスの構成方法に問題があることがわかります。
var SubClass = SuperClass.sub();
SubClass.configure("SubClass", "SubClassProperty");
ここで「configure」を呼び出すと、SuperClass から属性が消去されるように見えます。Model プロトタイプでの「toJSON」の実装は次のとおりです。
Model.prototype.toJSON = function() {
return this.attributes();
};
SubClass が構成されると属性コレクションがリセットされるため、SuperClass プロパティは JSON 文字列に含まれません。
サブクラス化されたオブジェクトで「configure」を呼び出すべきではないかどうかはわかりませんが、ドキュメントのどこにも、何か他のことをすべきだと言っている場所が見つかりません - モデルのサブクラス化について見つけることができる唯一のリファレンスです (から: http://spinejs.com/docs/models ):
モデルは簡単にサブクラス化することもできます:
var User = Contact.sub(); User.configure("User");