将JavaScript“类”原型复制到一个对象

5

我创建了一个名为User,它拥有一些属性,如:名称、ID、密码等。

我设置了一个构造函数,如下所示:

function User(name1, email, password) {
  this.name = name1;
  this.id = __GUID();
  this.type = __TYPE;
  this.addNewEmail(email);
  this.password = (new Password).createFromRawPassword(password).crypt;
}

还有一些原型函数,例如:

User.prototype.save = function(cb, callback) {
  return cb.bucket.upsert(this.id, this, function(err, res) {
    if (callback == null) {
      return callback(err, res);
    }
  });
};

User.prototype.addNewEmail = function(email) {
  this.emails = this.emails || [];
  return this.emails.push(email);
};

这对我非常有效,让我可以将我的对象存储为序列化的JSON(使用NodeJS在couchbase数据库中),而不必在对象中包含函数。
当我从数据库获取对象时,问题就来了。它按存储的所有属性返回,但我需要重新添加函数。我尝试使用一些我找到的extend函数进行混入,但它们将函数添加为自有属性,因此,下次我保存更新后的记录到数据库时,我得到函数已经保存的结果。
如何将接收到的对象转换回User类型的对象?以便在实例上也出现类所需的方法。

找到了一个临时解决方案:instance.__proto__ = User.prototype,但我觉得这很别扭。这对于Node.js来说可以吗?还有其他好的解决方案吗? - Vicenç Gascó
1个回答

11

有多种方法可以做到这一点:

这个大致与你的方式相同:

Object.setPrototypeOf(instance, User.prototype)

你可以实例化一个新对象并复制属性:

var obj = Object.assign(Object.create(User.prototype), instance);

你可以使用任何extend实现代替Object.assign(它目前还不可用原生)

或者,你可以改变你的User实现方式,将所有字段存储在单个对象属性内


第二个选项看起来更好,我只需创建一个新实例并添加JSON文件的所有属性。 - Vicenç Gascó

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接