原型函数被其他人覆盖 "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)
(其中util
是require('util')
),以及
- 在构造函数内部,调用
InputModel.apply(this, arguments);
或InputModel.call(this, <explicit list of input model ctr args>)
。
如果问题仍然存在,请返回进行另一个编辑。
我有以下输入模型:
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)
(其中util
是require('util')
),以及 - 在构造函数内部,调用
InputModel.apply(this, arguments);
或InputModel.call(this, <explicit list of input model ctr args>)
。
如果问题仍然存在,请返回进行另一个编辑。