Нет, вы не можете изменить функцию, на которую ссылается foo
. Вы можете сделать так, чтобы foo
ссылалась только на новую функцию, которая делает то, что вы хотите. Один из способов сделать это — использовать ваш toString
подход, но лучше избегать этого, если это вообще возможно, потому что функция, которую вы получите в результате, не будет такой же, как оригинал; область, к которой он имеет доступ, будет другой.
Обычно вам нужен прокси/оболочка, например:
// The original foo
var foo = function(arg) {
return "original foo says '" + arg + "'";
};
console.log(foo("bar"));
// Let's wrap it
(function() {
var originalFoo = foo;
foo = function() {
return originalFoo.apply(this, arguments) + " plus updated foo";
};
})();
console.log(foo("bar"));
Это не создает иерархию объектов или что-то подобное, оно просто обертывает foo
.
Если foo
является функцией-конструктором (назовем ее Foo
), вы также захотите скопировать Foo.prototype
:
// The original Foo
var Foo = function(arg) {
this.value = "original foo";
this.arg = arg;
};
Foo.prototype.getArg = function() {
return this.arg;
};
var f1 = new Foo("bar");
console.log(f1.getArg());
// Let's wrap it
(function() {
var originalFoo = Foo;
Foo = function() {
var rv = originalFoo.apply(this, arguments);
this.arg += " (plus more from augmented foo)";
return rv;
};
Foo.prototype = originalFoo.prototype;
})();
var f2 = new Foo("bar");
console.log(f2.getArg());
И, конечно же, если вам нужно обернуть функцию на Foo.prototype
, вы можете сделать это так же, как foo
в моем первом примере:
// The original Foo
var Foo = function(arg) {
this.value = "original foo";
this.arg = arg;
};
Foo.prototype.getArg = function() {
return this.arg;
};
var f = new Foo("bar");
console.log(f.getArg());
// Let's wrap its getArg
(function() {
var originalGetArg = Foo.prototype.getArg;
Foo.prototype.getArg = function() {
return originalGetArg.apply(this, arguments) + " updated";
};
})();
console.log(f.getArg());
Обратите внимание, что не имеет значения, что мы обернули функцию-прототип после создания объекта f
.
person
T.J. Crowder
schedule
22.02.2016
foo
? Можете ли вы придумать простую, но репрезентативную вещь, которую вам нужно сделать? - person T.J. Crowder   schedule 22.02.2016