Javascript将序列化对象数据插入到新对象中

时间:2014-04-12 10:55:42

标签: javascript

假设我有这个对象

Function Person(name){
    this.name = name;
    this.kill = function(){
        console.log(this.name + ' is now dead.');
    }
}

然后我这样做

var Tom = new Person('Tom');
var SerializedTom = JSON.stringify(Tom);
delete Tom // figuratively, Tom doesn't exist anymore

现在我想重新创建Tom

var NewTom = new Person();
NewTom = JSON.parse(SerializedTom);

基本上这就是我想要做的,但是kill函数丢失了。我的问题是如何在保持其功能的同时将序列化对象中的数据插入到新对象中?

2 个答案:

答案 0 :(得分:1)

没有开箱即用的答案。一种选择是修改Person对象,使其可以接受数据对象,然后复制数据对象上的所有内容:

function Person(data){
    var key;
    for (key in data) {
        this[key] = data[key];
    }
    this.kill = function(){
        console.log(this.name + ' is now dead.');
    };
}

// Usage
var Tom = new Person(JSON.parse(SerializedTom));

您可以通过类型检查支持两者:

function Person(data){
    var key;
    if (typeof data === "object") {
        for (key in data) {
            this[key] = data[key];
        }
    }
    else { // assume string
        this.name = data;
    }
    this.kill = function(){
        console.log(this.name + ' is now dead.');
    };
}

旁注:

您可以将kill放在Person分配给实例的原型上:

function Person(data){
    var key;
    if (typeof data === "object") {
        for (key in data) {
            this[key] = data[key];
        }
    }
    else { // assume string
        this.name = data;
    }
}
Person.prototype.kill = function(){
    console.log(this.name + ' is now dead.');
};

答案 1 :(得分:1)

我编写处理序列化的方法。这允许完全控制类的状态以及反序列化,并避免可能复制不应该是您的类的成员的字段。 它比T.J.更省力。克劳德的解决方案,更具动态性,但它有更多的控制权,在我看来是一种更清洁的方法。两者都很好。

function Person( name ) {
    this.name = name;
}

Person.prototype.kill = function() {
    console.log( this.name + " is now dead." );
};

// static method on the class where you receive your JSON object
// and create the instance of Person and set it up
// the way you want.
Person.fromJson = function( json ) {
    return new Person( json.name );
};

var Tom = Person.fromJson( JSON.parse( JSON.stringify( new Person( "Tom" ) ) ) );