对于具有局部变量的对象,JSON stringify然后解析工作意外

时间:2015-04-09 18:51:54

标签: javascript json parsing stringify

为什么JSON stringify然后解析不适用于此对象。它对于具有局部变量的对象是否有效?

function Task(description) {
    var _description = description;

    this.getDescription = function() {
        return _description;
    }
}

var task = new Task('wash car');
console.log(task.getDescription());
var json = JSON.stringify(task);
console.log(JSON.parse(json).getDescription());

2 个答案:

答案 0 :(得分:2)

JSON无法对函数进行字符串化(并且它不应该能够)。

但从技术上讲,当你需要Stringify一个对象时,你不需要这些函数。您可以按原样在应用程序中传递对象。

编辑:

如果您需要的是要在本地存储的对象,那么保存这些功能并不是一个好主意。您可以做的是存储对象的属性并在检索时创建新实例。

答案 1 :(得分:0)

不可能将构造函数的实例字符串化,并且在将其转换回对象后仍然是构造函数的实例。

相反,您需要为Task实例提供一个输出您可以存储的json字符串的方法,然后当您希望它再次成为Task的实例时,您可以创建一个新实例。

function Task(description) {
    var _description = description;

    this.getDescription = function() {
        return _description + '(possibly modified?)';
    }

    this.stringify = function () {
        return JSON.stringify({
            description: this.getDescription(), 
            _description: _description
        });
    }

}

var task = new Task('wash car');
console.log(task.getDescription()); // 'wash car (possibly modified?)'
var json = task.stringify();
console.log(json); // {"description": "wash car (possibly modified?)", "_description": "wash car"}
var taskAgain = new Task(JSON.parse(json)._description);
console.log(taskAgain.getDescription());  // 'wash car (possibly modified?)'

我添加了" (possibly modified?)"来证明为什么传递getDescription的结果和_description中存储的字符串非常重要。如果getDescription永远不会更改说明,则首先不需要getDescription,这可以大大简化整个过程。

function Task(description) {
    this.description = description;
}

var task = new Task('wash car');
console.log(task.description); // wash car
var json = JSON.stringify(task);
console.log(json); // {"description": "wash car"}
console.log(JSON.parse(json).description); // wash car
var taskAgain = new Task(JSON.parse(json).description);
console.log(task.description); // wash car