原型函数被其他“类”覆盖

时间:2015-02-02 10:54:35

标签: javascript node.js mocha node-assert

我有以下inputModel:

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;

在我的测试中,我想测试是否抛出了异常(使用node&#39s的断言模块):

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

不知何故,异常没有被抛出。我从构造函数输出的控制台是"这个"。 在控制台上,我没有看到输出"验证"。

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

更新 我在另一个文件中有另一个inputModel。这个"继承"来自InputModel。因此,似乎UserCreateInputModel.prototype.validate在其他inputModel中被覆盖。仍然没有得到它......

2 个答案:

答案 0 :(得分:0)

这一行:

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

正在修改InputModel对象。如果你有两种不同的类型"继承"从InputModel开始,你拥有validate种方法,然后一种方法覆盖另一方。

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

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

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

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

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

答案 1 :(得分:0)

UserCreateInputModel.prototype = InputModel不是你继承的方式。谁教你这个??? !!!

它&#39; S:

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

如果仍然存在,请回复另一个编辑。