gpt4 book ai didi

javascript - 通过 JSON 在 Node 服务器和 Web 客户端上使用对象方法?

转载 作者:太空宇宙 更新时间:2023-11-04 01:13:23 25 4
gpt4 key购买 nike

我有一个 Javascript 库,我想在 Web 浏览器和 Node.js 后端上使用它。在库中,我有多个对象,其方法定义如下:

function foo() {
this.bar = 200;
this.someMethod = function(baz) {
return this.bar + baz;
};
}

var x = new foo();

我可以通过执行以下操作在客户端或 Node.js 服务器中使用它:

x.someMethod(5);
=> (returns 205)

现在,当我 JSON.stringify 我的对象时,它会在没有该方法的情况下显示。

var string = JSON.stringify(x);
=> {"bar":200}

这意味着我无法在服务器上解压 JSON 并使用相同的方法。

var parsed = JSON.parse(string);
document.write(parsed.someMethod(5));
=> (doesn't do anything. the methods are gone!)

在基于类的系统中,我只使用复制构造函数。可以从 JSON 重建对象的东西。

function foo_copy_constructor(parsed_json) {
f = new foo();
f.bar = parsed_json.bar;
return f;
}

var z = foo_copy_constructor(parsed);
z.someMethod(5);
=> (returns 205 like it should)

(jsfiddle:http://jsfiddle.net/7FdDe/)

基本上,还有比这更好的方法吗?

我的许多对象都包含我用自己的方法编写的其他对象的实例,并且为每个对象构建构造函数似乎会很乏味,因为客户端和服务器都使用相同的库和对象定义。我知道 JavaScript 是基于原型(prototype)的,但我不太理解它们,因为我刚刚开始使用 JavaScript,并且习惯了 Python 和基于类的语言。

感谢您的帮助!

最佳答案

JSON.stringify 仅对具有 toJSON 方法的对象进行字符串化。因此,您只需将 toJSON 方法添加到您的方法中即可。 (请记住,函数也是对象。)

function A() {
this.method = function() { console.log(1); };
}

var c = new A();
JSON.stringify(c);
"{}"

A.prototype.otherMethod = function() { console.log(1); };

var c = new A();
JSON.stringify(c);
"{}"

Function.prototype.toJSON = function() { return this.toString(); };
JSON.stringify(c);
"{"method":"function () { console.log(1); }"}"

但是,当解析它回来时,您会得到字符串形式的函数。所以你必须将字符串返回到函数,如下所示:

var d = JSON.parse(JSON.stringify(c));
Object.keys(d).forEach(function(k) {

// If it starts with "function"
if (/^function/.test(d[k])) {

// Get the body of the function
var f = d[k].match(/{(.*)}/).pop();

// Replace the string with a real function
d[k] = new Function(f);
}
});

d.method();
1
<小时/>

但是,我宁愿建议您使用像 now.js 这样经过良好测试的库,而不是像这样乱搞 JavaScript。 .

关于javascript - 通过 JSON 在 Node 服务器和 Web 客户端上使用对象方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13946209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com