JavaScript 中的函数不仅仅是它们的代码。他们也有范围。代码可以字符串化,但范围不能。
JSON.stringify()
将编码 JSON 支持的值。其值可以是对象、数组、字符串、数字和布尔值的对象。其他任何内容都将被忽略或引发错误。函数不是 JSON 中受支持的实体。 JSON只处理纯数据,函数不是数据,而是具有更复杂语义的行为。
也就是说你可以改变方式JSON.stringify()
作品。第二个参数是replacer
功能。因此,您可以通过强制函数的字符串化来强制执行您想要的行为:
var obj = {
foo: function() {
return "I'm a function!";
}
};
var json = JSON.stringify(obj, function(key, value) {
if (typeof value === 'function') {
return value.toString();
} else {
return value;
}
});
console.log(json);
// {"foo":"function () { return \"I'm a function!\" }"}
但是当你读回来时,你必须评估函数字符串并将结果设置回对象,因为 JSON不支持功能.
总而言之,JSON 中的编码函数可能会变得非常复杂。你确定你要这么做吗?可能有更好的方法...
也许您可以保存原始数据,并将其从页面上加载的 JS 传递给构造函数。localStorage
只会保存数据,但加载到页面上的代码将提供对该数据进行操作的方法。
// contrived example...
var MyClass = function(data) {
this.firstName = data.firstName;
this.lastName = data.lastName;
}
MyClass.prototype.getName() {
return this.firstName + ' ' + this.lastName;
}
localStorage.peopleData = [{
firstName: 'Bob',
lastName: 'McDudeFace'
}];
var peopleData = localStorage.peopleData;
var bob = new MyClass(peopleData[0]);
bob.getName() // 'Bob McDudeFace'
我们不需要保存getName()
方法localStorage
。我们只需将该数据提供给提供该方法的构造函数即可。