2015-10-07 1 views
0
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 
} 

Это работает, но уродливо.
Так есть способ дополнить метод object.dosome, не создавая новую переменную, содержащую ее функцию?
Какой-то тип parent.dosome?Как дополнить функцию объекта снаружи

+0

Вы пытаетесь моделировать полиморфизм? –

ответ

0

возможно создать объект класса и определить в его protoype метод dosome().

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

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

Я думаю, вы должны прочитать немного о JS OOP. ES6 добавляет хороший синтаксический сахар, который может помочь вам добиться того, чего вы хотите, в меньшем количестве строк кода. Подробнее here.

Однако, если вы не хотите иметь проблемы с цепочкой прототипов, здесь более простым способом достижения того, что вы хотите:

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

Использование:

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 

Вы можете пойти один шаг дальше и избавиться от задания:

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