[英]Parsing functions stored as strings in object literal/JSON syntax and differetiating
[英]Parsing an Object with Functions
var Car = function(name, year) { this.name = name; this.year = year; this.print = function() { console.log(name+" "+year); } } var tesla = new Car("tesla", 2018); tesla.print(); tesla = JSON.parse(JSON.stringify(tesla)); console.log(tesla); tesla.print(); // Uncaught TypeError: tesla.print is not a function
解析后如何将打印功能添加到对象? 有没有一个优雅的解决方案?
您可以创建用于打印的原型并使用用于绑定的对象调用该方法。
function Car(name, year) { this.name = name; this.year = year; } Car.prototype.print = function() { // add prototype console.log(this.name + " " + this.year); // take this as reference to the instance }; var tesla = new Car("tesla", 2018); tesla.print(); tesla = JSON.parse(JSON.stringify(tesla)); console.log(tesla); Car.prototype.print.call(tesla); // borrow method from class, take own object
一个干净的方法是添加一个函数deserialize
作为原型,它接受一个对象并将所有属性分配给实例。
function Car(name, year) { this.name = name; this.year = year; } Car.prototype.print = function() { console.log(this.name + " " + this.year); }; Car.prototype.deserialize = function(object) { Object.entries(object).forEach(([k, v]) => this[k] = v); }; var tesla = new Car("tesla", 2018); tesla.print(); tesla = JSON.parse(JSON.stringify(tesla)); console.log(tesla); var tesla2 = new Car; tesla2.deserialize(tesla); tesla2.print();
JSON 数据格式不支持函数(如果您从 JavaScript 对象生成一些 JSON,然后尝试使用 C# 解析它,这将非常无用!)。
一个明智的方法是更改Car
构造函数,以便它可以接受一个对象作为第一个参数。
var Car = function(name, year) {
if (typeof name === "object") {
// use properties of `name` to set everything in this object
} else {
// Treat name and year as a string and number just like you are now
}
...
然后你可以:
tesla = new Car( JSON.parse(JSON.stringify(tesla)) );
...这也将生成一个具有正确原型的对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.