2012-10-28 85 views
0

我看到奇怪的行爲使用JSON.stringify針對Spine中的子類模型,我希望有人可以提供幫助!JSON.stringify使用Spine子類時丟失的超類屬性

下面是一些代碼,我們已經在我們的項目之一,得到了簡化的摘錄:

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(實例)」被打印出來正是我期望在這樣的情景:

result 
    SubClassProperty: "Sub" 
    SuperClassProperty: "Super" 
    cid: "c-0" 
    __proto__: ctor 

然而,當我使用JSON.stringify反對情況下,這是所有我回到:

{"SubClassProperty":"Sub"} 

爲什麼SuperClassProperty不包含在stringify中?

我已經通過強制JSON2覆蓋Chrome的本機JSON對象來排除JSON.stringify方法的問題;兩種實現都會產生相同的結果。它看起來像stringify將委託給對象上的「toJSON」函數(如果有的話) - 在這種情況下(作爲Spine的一部分)。所以它看起來像(a)這是Spine中的一個錯誤,或者(b)我做錯了某些事情,這是更可能的選擇。

我知道我可以通過重新配置的超性能的子類,以及解決此問題:

SubClass.configure("SubClass", "SuperClassProperty", "SubClassProperty"); 

然而,這似乎違反直覺的,我(什麼是子類的點?),所以我希望那不是答案。

更新:我已經做了通過脊柱源代碼一些調試,並從我可以告訴的問題是,我配置的子類方式:

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

調用「配置」這裏看起來是從SuperClass中清除了屬性。在模型的原型「的toJSON」實現如下:

Model.prototype.toJSON = function() { 
    return this.attributes(); 
}; 

由於屬性集合將重置子類是配置的時候,超類的屬性不JSON字符串來通過。

我不確定我是不是應該在子類對象上調用「configure」,但在文檔中找不到我應該做其他事情的任何地方 - 這是我能找到的唯一參考對於子類模型(來源:http://spinejs.com/docs/models):

模型也可以很容易地創建子類:

var User = Contact.sub(); 
User.configure("User"); 
+0

我不知道Spine是如何工作的,但是'JSON.stringify'只查看可以枚舉的,沒有繼承的或者不可枚舉的屬性的「自己的屬性」。如果你這樣做會發生什麼:'console.log(Object.keys(instance));'在結果數組中,你是否獲得超級屬性? –

+0

好問題 - 但它正確地通過:[「SuperClassProperty」,「SubClassProperty」,「cid」] – gerrod

+0

奇怪。這是本地的'Object.keys'方法嗎?如果你執行'instance.hasOwnProperty(「SuperClassProperty」)'會發生什麼?另外'Object.getOwnPropertyDescriptor(實例,「SuperClassProperty」)' –

回答

0

正如我懷疑,問題是,我使用脊柱的方式。 This comment from the author of Spine推斷在子類上使用「configure」會消除超類的屬性。我不得不承認我不明白爲什麼這是;這對我來說似乎是非常直觀的,但至少我現在知道這不是一個錯誤。

萬一別人運行到這個問題,我周圍的工作方式是加入我自己的擴展方法的脊柱模型如下:

(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正確地反映了super和subclasses的屬性。