3

I'm trying to override the play() method of the Audio object, but I don't want to do so just for a child object. I want to apply it to the standard Audio object.

The problem is I also want to use the original play() method. I've tried cloning the Audio object, making the changes, while calling the original Audio object's play() method and re-assigning back to the original Audio object. It doesn't work.

Ideas anyone? As an example, how could you add an alert() in the play() method while still calling the original play method?

plz. I need to do this because I have calling code generated by a tool that is calling new Audio. So it will be a super pain to constantly have to do a replace-all on this for the hundreds of code generations I'm doing.

1
  • 1
    Can we see the code you tried? :-) Commented Jun 12, 2012 at 7:15

3 Answers 3

5
Audio.prototype.play = ( function( old ) {
   var a=1, b=2, c=3; // your 'private' variables - if needed;
   return function() {
      console.log( a+b+c );// do something   
      return old.apply( this, arguments );// return 'original' results
   }
} )( Audio.prototype.play );
Sign up to request clarification or add additional context in comments.

Comments

4

Basically this could be done like this:

var playOriginal = Audio.prototype.play;
Audio.prototype.play = function(){
    playOriginal.apply(this, arguments);
}

But I'm not sure this will work for all browsers. Extending of native JS object is not recommended in most cases.

Comments

0

You can save the original play method, then replace the play method with a new method that can call the original method whenever it wants to.

Audio.prototype.playOriginal = Audio.prototype.play;
Audio.prototype.play = function(){
    this.playOriginal.apply(this, arguments);
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.