Иерархия JavaScript, почему родительские переменные не определены? - PullRequest
0 голосов
/ 03 декабря 2011

Я написал два класса на днях, где мне нужно было переопределить и вызвать переопределенный метод (getQuery).

//parent
function SimpleUser() {
   this.firstName = "X";
}

SimpleUser.prototype.getQuery = function(sub) {
  //solution for not getting undefined variables
  var that = sub || this; 
  var query = "first="+that.firstName;
  return query;
}

//child
function User() {
  //extends 
  this.base = SimpleUser;
  //super()
  this.base();

  //prints "X"
  console.log(this.firstName);

  this.lastName = "Y";
}

//override
User.prototype.getQuery = function() {
  //call parent
  var query = SimpleUser.prototype.getQuery.call(this);
  query += "&last="+this.lastName;
  return query;
}

//prints "first=X"
console.log(new SimpleUser().getQuery());

//prints "first=undefined&last=Y" if I don't use parameter "sub"
console.log(new User().getQuery());

Когда я вызываю метод "getQuery" из подкласса, все переменные в родительском элементе не определены. Если я вызываю их из конструктора подкласса, они в порядке.

Я решил проблему, передав подкласс в качестве параметра и просто проверив, кто спрашивает.

Может кто-нибудь объяснить мне, почему это происходит, и помочь мне найти лучшее решение, чем то, что я должен был сделать, передав сам подкласс в качестве параметра?

Спасибо!

1 Ответ

0 голосов
/ 03 декабря 2011

Javascript не имеет классов. У него есть только объекты. И объекты наследуют от своих прототипов, которые, в свою очередь, наследуют от своих прототипов и так далее. Если вы хотите узнать больше о создании наследования в javascript, взгляните на http://phrogz.net/js/classes/OOPinJS2.html. Хотя это выполнимо, если вы хотите имитировать классы и наследование классов в javascript, я рекомендую использовать специально разработанную для этого среду, такую ​​как MooTools.

...