2011-02-23 99 views
8

我有一套我在整個應用中使用的javascript類。在一個案例中,我想從一個形狀與我的類相匹配的ajax響應中評估一些json。javascript:鑄造一個已經用eval創建的對象

我正在使用jquery parseJSON方法爲我做eval。

唯一的問題是我現在想調用我的類中定義的方法,但是我知道該方法不會存在於eval對象上。

什麼是使我的新對象可用這種方法最好的方法。有沒有辦法「施放」它?

+1

我已經想了很長一段時間了。 – Kayla 2011-02-23 23:10:11

+0

看看[我的答案在這裏](http://stackoverflow.com/questions/5063558/javascript-overriden-method/5063837#5063837)。你可以用它來擴展你從JSON中獲得的對象和你的「class」的原型。 (或者只是將數據從JSON複製到@ Box9很好地演示的「類」的對象;)) – 2011-02-23 23:25:43

回答

6

在JavaScript中沒有鑄造的概念。相反,你可以修改你的類的構造函數來接受一個普通的對象。你如何做到這一點取決於您如何設置類,但可以簡單地涉及對象的淺拷貝到類的新實例:

var MyClass = function (obj) { 
    for (var i in obj) { 
     if (!obj.hasOwnProperty(i)) continue; 
     this[i] = obj[i]; 
    } 
    // Other class initialisation code 
}; 

然後「投」你的對象是這樣的:

var result = new MyClass(someObject); 

如果您有需要此多個類,您可能希望創建一個extend函數,它克隆了你(或者,如果你使用jQuery,這個功能已經存在):

var extend = function (obj1, obj2) { 
    for (var i in obj2) { 
     if (!obj2.hasOwnProperty(i)) continue; 
     obj1[i] = obj2[i]; 
    } 
}; 

然後「cast」像這樣:

var result = new MyClass(); 
extend(result, someObject); 
+0

否則稱爲序列化和反序列化您的對象。 – Raynos 2011-02-23 23:26:14

+0

有趣,雖然我不確定這個位「var result = new MyClass(s​​omeJson);」當然,「someJSON」或者需要在構造函數中被評估,或者它已經被評估過,在這種情況下,它應該被稱爲「someObject」? – 2011-02-23 23:28:04

+0

@Raynos,不是真的。 OP已經使用'parseJSON'將其反序列化 - 他需要一種方法將其複製到某個類的實例中。 – 2011-02-23 23:28:40