JSON 对具有局部变量的对象进行字符串化然后解析出乎意料地工作

JSON stringify and then parse works unexpectedly for the object with local variable

为什么 JSON 字符串化然后解析不适用于此对象。它对具有局部变量的对象不好吗?

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

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

但从技术上讲,当您需要对对象进行字符串化时,您不需要这些函数。您可以按原样在您的应用程序中传递对象。

编辑:

如果您需要的是要在本地存储的对象,那么将函数与其一起保存也不是一个好主意。您可以做的是存储对象的属性并在检索它时创建一个新实例。

无法对构造函数的实例进行字符串化,并使其在将其变回对象后仍然是构造函数的实例。

相反,您需要为 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