我看到奇怪的行爲使用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");
我不知道Spine是如何工作的,但是'JSON.stringify'只查看可以枚舉的,沒有繼承的或者不可枚舉的屬性的「自己的屬性」。如果你這樣做會發生什麼:'console.log(Object.keys(instance));'在結果數組中,你是否獲得超級屬性? –
好問題 - 但它正確地通過:[「SuperClassProperty」,「SubClassProperty」,「cid」] – gerrod
奇怪。這是本地的'Object.keys'方法嗎?如果你執行'instance.hasOwnProperty(「SuperClassProperty」)'會發生什麼?另外'Object.getOwnPropertyDescriptor(實例,「SuperClassProperty」)' –