简体   繁体   中英

How to supplement object function from outside

var object = {}; //lots of stuff in here

var func = object.dosome;

object.dosome = function(a,b) {
    func(a,b);
    //someth else here i need to add 
}

This works but ugly.
So is there a way to supplement object.dosome method, without creating a new variable containing it's function?
Some sort of parent.dosome?

maybe create a class Object and define in its protoype the dosome() method.

var Object =  new function() {}; //lots of stuff in here

Object.prototype.dosome = function(a,b) {
    func(a,b);
}
//and then
var myObject = new Object();

I think you should read a little about JS OOP . ES6 adds some nice syntactic sugar that can help you achieve what you want in fewer lines of code. Read more here .

However, if you don't want to have problems with the prototype chains, here's a simpler way of achieving what you want:

function chain (baseFunc, func) {
  return function () {
     var args = [].slice.call(arguments, 0);
     args.unshift(baseFunc);
     return func.apply(this, args);
  };
}

Usage:

var obj = { 
  doSome: function (a, b) { return a + b; } 
};

obj.doSome(4, 5); // 9

obj.doSome = chain(obj.doSome, function (baseFunc, a, b) {
   var result = baseFunc(a, b);   
   return result + 10;
});

obj.doSome(4, 5); // 19

You can go one step further and get rid of the assignment:

function extend (instance, method, func) {
    instance[method] = chain(instance[method], func);
}

extend(obj, "doSome", function (baseFunc, a, b) {
    var result = baseFunc(a, b);   
    return result + 2;
});

obj.doSome(4, 5); // 21

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM