原型函数被其他人覆盖 "class"

Prototype function overriden by other "class"

我有以下输入模型:

var UserCreateInputModel = function(req) {
    ...
    this.password = req.body.password;
    this.repeatPassword = req.body.repeatPassword;
    ...

    console.log(this.password !== this.repeatPassword);

    this.validate();
};
UserCreateInputModel.prototype = InputModel;

UserCreateInputModel.prototype.validate = function() {
    console.log('Validating...');
    if(this.password !== this.repeatPassword) throw new Error('Passwords are not equal!');
};

module.exports = UserCreateInputModel;

在我的测试中,我想测试是否抛出了异常(使用节点的断言模块):

//Act
assert.throws(function() {
    new UserCreateInputModel(req);
}, Error);

不知何故没有抛出异常。构造函数的控制台输出是 "this"。 在控制台上我没有看到输出 "Validating".

我想这是一些 JavaScript 陷阱或类似的东西(关于这个),但我只是没有得到错误...

更新 我在另一个文件中有另一个 inputModel。这个 "inherites" 也来自 InputModel。所以似乎 UserCreateInputModel.prototype.validate 在另一个 inputModel 中被覆盖了。还是不明白...

这一行:

UserCreateInputModel.prototype.validate = function() {
    console.log('Validating...');
    if(this.password !== this.repeatPassword) throw new Error('Passwords are not equal!');
};

正在修改 InputModel 对象。如果你有来自 InputModel 的两种不同类型 "inheriting" 和你这里的类型,并且它们都有 validate 方法,那么一个会覆盖另一个。

要正确继承 InputModel,请使用 Object.create():

UserCreateInputModel.prototype = Object.create(InputModel.prototype);

然后从子构造函数调用父构造函数:

var UserCreateInputModel = function(req) {
    InputModel.call(this, <arguments>);

这样,当您修改 UserCreateInputModel.prototype 时,您将 修改 UserCreateInputModel.prototype 而不是任何其他内容。

UserCreateInputModel.prototype = InputModel 不是您进行继承的方式。谁教你的???!!!

是:

  • 在构造函数之后,util.inherits(UserCreateInputModel, InputModel)(其中utilrequire('util')),以及
  • 在构造函数内部,调用InputModel.apply(this, arguments);InputModel.call(this, <explicit list of input model ctr args>)

如果问题仍然存在,请返回进行另一个编辑。