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

Javascript将序列化对象数据插入新对象,javascript,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

假设我有这个物体

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
现在我想重现汤姆

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

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

没有现成的答案。一个选项是修改您的
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.');
};

我将编写处理序列化的方法。这允许对类的状态以及反序列化进行完全控制,并避免对不应该是类成员的字段进行复制。 这比T.J.Crowder的解决方案要努力一点,后者更具动态性,但它有更多的控制能力,在我看来,这是一种更干净的方法。不过,两者都很好

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" ) ) ) );

你现在想把
name
改成
this.name
。如果我把这个函数放在原型上会有什么不同呢
基本上我想问的是
javascript
是否有类似
php
的非序列化功能,我想这显然是不幸的。谢谢@php_nub_qq:如果将其放在原型上,那么所有实例都共享同一个函数副本。如果在构造函数中创建,则每个实例都会获得自己的函数副本。对于一小部分你不经常创建和发布的实例,这并不重要;如果你正在创建大量的函数(或者创建和发布大量函数),那么创建不必要的函数会增加内存流失。@T.J.Crowder谢谢你提供的有用信息,这是我不知道的!静态函数附加到类本身,即不能在实例上调用它,只能在类上调用它。原型方法看起来仍然是实例上的方法,只是它们是共享的。特别是,实例方法可以访问实例成员,而静态方法不能(因为它们不是任何实例的一部分)。