2015-02-02 3 views
0

У меня есть следующий 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; 

В моем тесте я хотел бы проверить, если было сгенерировано исключение (с помощью модуля Assert узла):

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

Как-то исключение просто не бросали. Мой консольный вывод из конструктора «это». На консоли я не вижу выход «Validating».

Я предполагаю, что это какой-то JavaScript ловушкой или что-то подобное (об этом), но я просто не получаю сообщение об ошибке ...

Update У меня есть еще один inputModel в другом файле. Это «наследует» от InputModel тоже. Таким образом, кажется, что UserCreateInputModel.prototype.validate переопределяется в другой inputModel. До сих пор не понимаю ...

ответ

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, а не что-нибудь еще.

+0

Если 'InputModel' является конструктором, вы забыли' .prototype' внутри 'Object.create'. Удобство 'util.inherits' делает это для вас плюс устанавливает' 'конструктор'' должным образом. –

+0

@herby Я приостанавливаю недоверие и предполагаю, что OP получил его в основном правильно и просто ушел из 'Object.create()'. Вполне возможно, что 'InputModel' сам по себе является прототипом, который OP хочет использовать – JLRishe

+0

Hm. Именование предлагает иначе, но только ОП знает наверняка. В моем пессимизме я даже представляю даже худший сценарий: этот страшный «шаблон» «SubClass.prototype = новый SuperClass();», также может быть, что «InputModel» - такой полномасштабный экземпляр. : - \ Но может быть и то, что я здесь слишком пессимистичен. –

0

UserCreateInputModel.prototype = InputModel не так, как вы наследуете. Кто тебя научил ??? !!!

Это:

  • после конструктора, util.inherits(UserCreateInputModel, InputModel) (где util является require('util')), и
  • внутри конструктора, вызывая InputModel.apply(this, arguments); или InputModel.call(this, <explicit list of input model ctr args>).

Вернитесь с другим EDIT, если он по-прежнему сохраняется.

Смежные вопросы