【发布时间】:2016-12-19 18:20:57
【问题描述】:
我正在为一些特定于应用程序的对象编写一个简单的序列化/反序列化框架。
考虑以下几点:
"use strict";
function Dog(name) { this._name = name; };
Dog.prototype.constructor = Dog;
Dog.prototype.getName = function() { return this._name; }
var d1 = new Dog('fido');
var d2 = JSON.parse(JSON.stringify(d1)); // serialize / deserialize
> d1
Dog { _name: 'fido' }
> d1.getName()
'fido'
> d2
{ _name: 'fido' }
> d2.getName()
TypeError: d2.getName is not a function
此时,可以问“d1 有哪些 d2 缺少的东西?”
一种部分有效的方法是手动将 d1 的方法分配给 d2:
> d2.constructor = d1.constructor
> d2.getName = d1.getName
> d2.getName()
'fido'
这有几个缺点。首先,我必须手动将 d1 的每个方法分配给 d2。其次,d2 有自己的属性,不使用原型机制共享槽:
> d2
Dog {
_name: 'fido',
constructor: [Function: Dog],
getName: [Function] }
所以我提炼的问题是:给定一个对象(例如d2),有没有办法将它与另一个对象的原型(例如d1)相关联,从而继承相同的行为?
【问题讨论】:
-
元评论:虽然这似乎是一个重复的问题,但stackoverflow.com/questions/8039534/… 中给出的答案对于 node.js 环境并不理想。这里给出的答案好多更好。那么它仍然是重复的吗?
-
是的,它仍然是重复的。这里给出的答案也可以转移到另一个问题。
-
@Louis 但是如果这个问题更好,那么这个问题应该作为这个问题的副本关闭。
-
我看了这两个问题,并不认为这个问题比另一个问题明显好。
-
@Louis 但是这里的答案肯定更好。另一个问题的答案在 Node.js 中不起作用。在某些情况下它不起作用,例如this。此外,这两个问题略有不同 - 在这个 OP 中引用了类,而在另一个 OP 中只有类的名称作为字符串。
标签: javascript json node.js class serialization