gpt4 book ai didi

javascript - 无需代理即可更改函数行为

转载 作者:行者123 更新时间:2023-11-28 18:44:49 27 4
gpt4 key购买 nike

我可以做这样的事情:

var foo = ...// some function assignment
var fooString = foo.toString()
...
// add some alert to foo
...
var fooWithAlert = new Function(forStringWithAlert)

有没有办法先改变 foo 而不是创建新函数?我需要它来修补一些依赖项,而无需重新创建整个对象层次结构。

我需要修补库中的构造函数,只需在每次调用时添加警报即可。但无需处理原型(prototype)

最佳答案

不,您不能修改 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 对象之后包装原型(prototype)函数并不重要。

关于javascript - 无需代理即可更改函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35551009/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com