Override function (e.g. “alert”) and call the original function?

前端 未结 5 2150
小鲜肉
小鲜肉 2020-11-28 10:20

I would like to override a Javascript built-in function with a new version that calls the original (similarly to overriding a method on a class with a version that calls

相关标签:
5条回答
  • 2020-11-28 10:59

    Store a reference to the original function in a variable:

    (function() {
        var _alert = window.alert;                   // <-- Reference
        window.alert = function(str) {
            // do something additional
            if(console) console.log(str);
            //return _alert.apply(this, arguments);  // <-- The universal method
            _alert(str);                             // Suits for this case
        };
    })();
    

    The universal way is <original_func_reference>.apply(this, arguments) - To preserve context and pass all arguments. Usually, the return value of the original method should also be returned.

    However, it's known that alert is a void function, takes only one argument, and does not use the this object. So, _alert(str) is sufficient in this case.

    Note: IE <= 8 throws an error if you try to overwrite alert, so make sure that you're using window.alert = ... instead of alert = ....

    0 讨论(0)
  • 2020-11-28 11:07

    I'm assuming your question is how do you overwrite a built-in and still be able to call it. First off as a disclaimer, you should never overwrite built ins unless you have a good reason for doing it since it will make it impossible to debug/test.

    This is how you would do it:

    window._alert = window.alert;
    window.alert = function(str) { 
         if(console) console.log(str);
         window._alert(str);
    }
    
    0 讨论(0)
  • 2020-11-28 11:10

    How to do simple classical inheritance in Javascript:

    SuperClass.call(this) // inherit from SuperClass (multiple inheritance yes)
    

    How to override functions:

    this.myFunction = this.myFunction.override(
                        function(){
                          this.superFunction(); // call the overridden function
                        }
                      );
    

    The override function is created like this:

    Function.prototype.override = function(func)
    {
     var superFunction = this;
     return function() 
     {
      this.superFunction = superFunction;
      return func.apply(this,arguments);
     };
    };
    

    Works with multiple arguments.
    Fails when trying to override undefined or nonfunctions.
    Makes "superFunction" a "reserved" word :-)

    0 讨论(0)
  • 2020-11-28 11:14

    JavaScript does not use a classical inheritance model. There is a nice article here which describes a way to write your classes so that a similar syntax can be used, but it's not natively supported.

    0 讨论(0)
  • 2020-11-28 11:15

    There is no "super". Anyway, create a closure to "keep" around the original function-object.

    Note the "self invoking function" that returns a new function-object (that is assigned to the window.alert property). The new function-object returned creates a closure around the variable original which evaluates to the original value of window.alert that was passed in to the "self invoking function".

    window.alert = (function (original) {
      return function (str) {
        //do something additional
        if(console) {
          console.log(str)
        }
        original(str)
      }
    })(window.alert)
    

    However, I believe some browsers may prevent alert and other built-ins from being modified...

    Happy coding.

    0 讨论(0)
提交回复
热议问题