Javascript 什么是关于打字脚本的猴子补丁?

Javascript 什么是关于打字脚本的猴子补丁?,javascript,typescript,angular,Javascript,Typescript,Angular,有人能给我一个关于打字稿和Angular2的猴子补丁的例子,并解释一下吗 因为JavaScript是高度动态的,所以您可以用新函数替换任何对象上的成员函数(以及相关功能)。它允许您在不改变原始代码的情况下修改代码的行为 下面是TypeScript中的一个简单示例: // original code, assume its in some library interface Foo { a:number, b():number } var foo:Foo = {a:123,b:fu

有人能给我一个关于打字稿和Angular2的猴子补丁的例子,并解释一下吗

因为JavaScript是高度动态的,所以您可以用新函数替换任何对象上的成员函数(以及相关功能)。它允许您在不改变原始代码的情况下修改代码的行为

下面是TypeScript中的一个简单示例:

// original code, assume its in some library
interface Foo {
    a:number,
    b():number
}
var foo:Foo = {a:123,b:function(){return this.a}} 

// Monkey patch the function b with a new one
// Allows you to change the behaviour of foo without changing the original code
foo.b = function(){return 456}
更多:猴子补丁不仅仅是拦截 当您替换函数但保留原始行为时,这是函数拦截。是的,您使用monkey patching进行函数拦截(替换函数),但调用原始函数不是monkey patching的要求

  • python答案(仅替换/重写)
同样来自Wikipedia:一个明显取代原始行为的应用程序:

在运行时替换方法/类/属性/函数,例如在测试过程中删除函数


最后,仅仅因为你可以调用原始版本并不意味着你必须在进行monkey patching时调用原始版本。

公认的答案并不是真正意义上的
monkey patching
。这是一个重写函数的示例

monkey patching
的关键是将
原始函数
分配给一个变量(供以后使用),并用
新函数
-替换/覆盖,但是
新函数
也必须调用
原始函数

演示


这里有一个关于猴子补丁的很好的解释:我不认为这是猴子补丁,它只是覆盖了Foo.b函数。此外,重写通常在继承的实例上进行(无直接变异)。@Drenai重写,在OO意义上,将意味着创建一个以原始对象为原型的新对象,并在新对象中重新定义方法。修补是修改现有对象及其作为原型的所有对象的行为,并替换原始方法-即使它(可选)调用原始方法,制作这样的补丁的全部目的是在不修改正在使用的库的源代码的情况下改变行为,等等。您通常只需要
返回originalfancuton.apply(这个),添加到变量以使其更清晰。它不必调用原始函数。通常,猴子补丁会在某些情况下替换不同的行为(例如,检查传递的参数),以决定是调用原始补丁还是执行其他操作。
class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}

let originalFunciton = Greeter.prototype.greet;

Greeter.prototype.greet = function () {
    alert('In Monkey Patched Function');
    let returnValue = originalFunciton.apply(this); 
    return returnValue;
};

let greeter = new Greeter("world");

let button = document.createElement('button');
button.textContent = "Say Hello";
button.onclick = function() {
    alert(greeter.greet());
}

document.body.appendChild(button);