2014-05-16 94 views
-1

我有一個關於對象的名稱屬性的問題,所以這裏是一種情況: 即時通過prototype.constructor創建自定義對象(稱爲Notka),並用一些方法添加了原型,然後im推送將其轉換爲對象數組,然後將數組轉換爲json對象並將其保存在外部服務器上。到現在爲止還挺好。對象的名稱屬性,javascript

當即時通訊從外部服務器獲取它作爲json並將其轉換爲對象數組名稱屬性的對象丟失,即時獲取匿名對象,不認識他們的方法。我有幾個想法來避免將數組轉換爲對象,反之亦然,並避免所有這些混亂,但我不求好奇,是否有辦法保留對象的名稱或更改匿名對象的名稱。

我嘗試創建我的自定義類型的新對象,如:

var nt = new Notka(); // my custom object 
nt = tab[index]; // tab is a array containing objects fetched from external sever 

,但它不能正常工作,新創建的Notka有constructor.name Notka但生病時分配對象我再有匿名對象。

感謝您事先的任何答案:)

庫巴

+0

我會想你的服務器代碼將是與此有關。你到底如何保存它? –

+0

我認爲這個名字在轉換過程中丟失了,我使用node.js表達框架和使用POST方法的XMLHTTPRequest。它是儘可能簡單和標準:) – user1692950

回答

0

不,你不能序列化JSON對象並保留名稱或功能的方法(這是什麼Notka是,不是簡單的對象)。當你將這個對象保存到數據庫時,它首先被轉換成一個字符串。你的數據庫得到的是JSON.stringify(nt);的輸出。因此,當它回到您的位置並進行解析時,它會丟失所有內容,除了JSON standard中允許的內容外,它與JavaScript,node.js或其他內容不同。它非常簡單,只允許某些數據類型(基本上是普通對象,數字,字符串和數組)。

這聽起來像你可能要修改你的構造函數,這樣就可以做這樣的事情,而不是:

var nt = new Notka(tab[index]); 

如果你這樣做只是nt = tab[index]你正在破壞參照原Notka對象之前創建。

所以也許

var Notka = function(obj) { 
    for (var i in obj) 
     this[i] = obj[i]; 
}; 

Notka.prototype.multiply = function(times) { 
    return this.someProperty * times; 
}; 

var tab = [{ 
    someProperty: 4, 
    another: "notka!" 
}, { 
    someProperty: 15, 
    another: "lalalala" 
}]; 

var nt = new Notka(tab[0]); 
nt.multiply(5); 

// 20 
+0

Ty是一個解決方案,仍然有點困惑如何使用原型和如何應該在JavaScript看起來。 – user1692950

+0

要記住的最重要的事情是JSON和JavaScript不是一回事--JSON是一種與語言無關的序列化格式(如XML),它恰好映射到JavaScript數據結構。國際海事組織(IMO)最強大的JavaScript功能就是它的功能性編程功能,所有這些功能都不可能僅使用JSON(就像你發現的那樣)。而且,是的,原型繼承是關於OOP的一種不同的思考方式,並且它需要根據自己的條件來考慮** - 爲自己忙個不停 - 嘗試使用Java作爲參考來理解它。 – tjb1982