2011-02-23 100 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