0

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");
4

1 に答える 1

0

私が疑ったように、問題は Spine の使用方法にありました。Spine の作成者からのこのコメントは、サブクラスで「configure」を使用すると、スーパークラスの属性が消去されると推測しています。これがなぜなのか理解できないことを認めなければなりません。直感に反するように思えますが、少なくともバグではないことがわかりました。

他の誰かがこの問題に遭遇した場合に備えて、私が回避した方法は、次のように Spine モデルに独自の拡張メソッドを追加することです。

(function () {
    var Model = Spine.Model;

    Model.configureSub = function () {
        var baseAttributes = this.attributes.slice();
        this.configure.apply(this, arguments);

        this.attributes = baseAttributes.concat(this.attributes);
        return this;
    };
})();

次に、サブクラスを構成します。

var SubClass = SuperClass.sub();
SubClass.configureSub("SubClass", "SubClassProperty");

これで、JSON はスーパークラスとサブクラスの両方のプロパティを正しく反映するようになりました。

于 2012-10-31T03:39:06.930 に答える