Подкласс JavaScript - как наследовать родительские значения, определенные в параметре?

Как с помощью JavaScript создать подкласс, который наследует значения от родительского класса? Эти значения, которые мне нужно наследовать, определяются параметрами родительского класса. Я хочу иметь отношения «один ко многим» между родительским классом и дочерним классом. Вот мой пример кода, где песня состоит из одного или нескольких треков:

function Song(x){
  this.x = x;
}

function Track(y){
  Song.call(this);
  this.y = y;
}

Track.prototype = new Song;


var mySong = new Song(1);
mySong.guitar = new Track(2);
mySong.bass = new Track(3);
// goal is to output "1 1 2 3" but currently outputs "undefined undefined 2 3"
console.log(mySong.guitar.x + " " + mySong.bass.x + " " + mySong.guitar.y + " " + mySong.bass.y );  

Этот вопрос похож на этот вопрос подкласса (http://stackoverflow.com/questions/1204359/javascript-object-sub-class), но использует переменные, определенные параметрами. Прямо сейчас, когда я пытаюсь вызвать parentObject.childObject.parentVariable, он возвращает значение undefined. Что мне нужно изменить в коде, чтобы это заработало, или есть лучший способ закодировать эту связь «один ко многим родитель-потомок»?


person Greg    schedule 15.01.2011    source источник
comment
Вся установка не имеет для меня особого смысла. Почему Track должен быть назначен экземпляру Song и каким-то образом наследовать свойства этого конкретного экземпляра? И даже если Track является подклассом Song, то mySong и mySong.guitar это два совершенно разных экземпляра.   -  person Felix Kling    schedule 16.01.2011
comment
Согласен... тут что-то неладно. Если он хочет, чтобы у Song() было много объектов Track(), Song() должна иметь this.aTracks = new Array(); а затем он мог mySong.aTracks.push(новый трек(что угодно)). Но трудно сказать, какая здесь цель.   -  person Krumelur    schedule 16.01.2011


Ответы (1)


Итак, похоже, вы не хотите наследования, вам нужна композиция.

Я постараюсь найти хорошую ссылку.

Я не нашел хороших ссылок, и когда я больше смотрел на ваш код, я еще больше запутался. Вот что-то, что выполняет то, что вы хотите, но я не уверен, что это действительно полезно, особенно потому, что оно делает несколько вещей, которые я обычно не рассматриваю.

function Song(x){
  this.x = x;
}

Song.prototype.addTrack = function(name, track) {
  this[name] = track;
  track.x = this.x;
}

function Track(y){
  this.y = y;
}


var mySong = new Song(1);
mySong.addTrack('guitar', new Track(2));
mySong.addTrack('bass', new Track(3));

console.log(mySong.guitar.x + " " + mySong.bass.x + " " + mySong.guitar.y + " " + mySong.bass.y );

Мне кажется, что лучшим решением было бы:

function Song(x){
  this.x = x;
  this.tracks = [];
}

Song.prototype.addTrack = function(track) {
  this.tracks.push(track);
}

Song.prototype.output = function() {
   // loop on this.tracks and output what you need using info from 'this' and 
   // each track
}


function Track(y){
  this.y = y;
}
person Hemlock    schedule 15.01.2011
comment
Я согласен, что ваше второе решение лучше. Мне нужен массив для хранения всех дорожек для каждого объекта Song. И вы правы, что я имел в виду композицию, а не наследование. Мне еще многое предстоит узнать о компьютерных науках. - person Greg; 16.01.2011