TEL:400-8793-956
当前位置:程序、服务器

无法理解Playlist.prototype.play和Playlist.Prototype.stop函数中的.play()和.stop()

提问者: 近期获赞: 浏览人数: 发布时间:2021-02-05 09:59:25

 问:Playlist.prototype.play函数中的.play()和.stop()使我在playlist.js文件中感到困惑。他是否正在使用Song构造函数中的原型方法?如果是这样,我以为只有构造函数的实例才能继承方法?播放列表构造函数中的原型方法如何在没有原型继承的情况下从Song构造函数中调用方法(我希望这是有道理的)?Song构造函数的.play()和.stop()原型方法不是在该特定构造函数的范围内,而不是在另一个构造函数的范围内全局且可访问的原型方法吗?而且这也很令人困惑,因为调用currentSong.play()的原型函数也是Playlist.prototype.play。我正在混音。

 
最后,然后,Playlist.prototype.play函数中的.play()如何知道要选择哪个.play()?如果我上面的问题部分得到回答,则可能会更清楚地回答。谢谢!
 
答:当您在播放列表构造函数中看到它时,您问它是否使用Song构造函数的play方法:
 
播放清单。原型。play  =  function () { 
var currentSong = this 。歌曲[这个。nowPlayingIndex ]; currentSong 。播放(); };     
  
 
是确实如此,它实际上调用了Song构造函数中定义的play方法。
 
为什么呢 因为您已经注意到,该方法是在名为currentSong的对象上调用的,所以currentSong是一个对象,要感谢您设置的PlayList对象的当前索引。
 
要查看它,请检查播放列表构造函数
 
函数 Playlist () {
此。歌曲= []; //然后在数组中填充我们在app.js文件this中创建的所有歌曲对象。nowPlayingIndex = 0 ; //此属性是根据currentSong设置的(例如,当我们按下下一个和上一个按钮时会更改)。}     
     
 
如您所见,每个播放列表对象都带有一个包含所有歌曲对象的数组和一个带有当前歌曲的属性(其在数组中的索引)。但是,当您创建此对象时,该数组首先为空,因此稍后需要填充该数组。
 
填充在app.js文件中创建的播放列表对象。安德鲁首先创建所有歌曲(显然是基于构造函数Song创建的对象)。
 
检查下面的代码以查看它。
 
VAR  hereComeTheSun  = 新 曲(“太阳出来了” ,“披头士” ,“2:54” ); 
var  WalkingOnSunshine  = 新 歌曲(“ Walking on Sunshine” , “ Katrina” ,“ 3:54” );
他不仅设置了歌曲的名称及其持续时间,而且在构造函数中定义了这些歌曲的属性(isPlaying)默认设置为boolean false。因此它们都具有此属性以及在原型的帮助下定义的方法。
 
这些方法之一是play方法...(您正在谈论的一种方法,在播放列表的play方法内部被调用,但在歌曲对象上被调用!)。
 
宋。原型。play  =  function () { 
this 。isPlaying = true ; };    
 
之后,随着歌曲的创建,由于先前创建的播放列表构造器的add方法,Andrew将所有歌曲添加到Playlist对象(最初为空)内部的songs数组中。
 
播放清单。添加(hereComeTheSun ); 
播放清单。添加(walkingOnSunshine ); 
//实际上,这会使用添加的歌曲对象填充播放列表对象中的歌曲数组。请记住,它们具有其属性和方法(例如play方法等)。
 
您可能已经看到,这个add方法只是使用本机Javascript push方法来填充数组。
 
因此,我们现在有了一个播放列表对象,其中的歌曲对象填充了我们的歌曲数组,而不是在播放列表对象中包含一个空数组。
 
不要忘记,我们推送的这些歌曲具有和我已经在上面写过的属性“ isPlaying”一样的默认设置,并且默认情况下将其设置为false以及诸如stop和play之类的方法。
 
如您所见,Andrew使用Playlist构造函数创建播放列表构造函数时,还可以使用其他一些方法。其中一个是例如下一种方法。
 
发生的是,当我们单击next按钮时,将调用next方法。
 
因此,我们的播放列表对象中的nowPlayingIndex属性将增加..,从而改变了currentSong!
 
首先,创建播放列表时,nowPlayingIndex为0。
 
因此,根据我们首先在上面添加的歌曲,在播放列表对象的play方法中定义的currentSong变量称为“ here Come the Sun”。因为当前索引最初是0。
 
作为垃圾对象,它看起来像这样
 
{标题: “太阳来了” ,
艺术家:“披头士乐队” ,时长:“ 2:54” ,isPlaying :true ,play :function (){ / ** ** / this 。IsPlaying :真实; },stop :function (){ this 。isPlaying = false ; } } / *   var currentSong = this.songs [this.nowPlayingIndex];   currentSong.play(); 在歌曲对象上调用play方法  
 
* /
因此,当我们按下下一个按钮时,它是存储在播放列表对象的歌曲数组中的下一首歌曲,它存储在currentSong变量中,并且可以调用存储在currentSong变量中的该对象的方法。
 
因此,即使两个对象都具有play方法,这也不成问题,因为当您在currentSong变量上调用play方法时,您会调用当前歌曲* object的play方法!
 
我希望这更有意义。
上一篇: 什么是支持URL?
下一篇: 我没有在while循环中忘记playHoldMusic()。我还使用poll()删除了csr。仍然错误