【问题标题】:What is monkey patching regarding TypeScript ?什么是关于 TypeScript 的猴子补丁?
【发布时间】:2016-01-19 22:21:29
【问题描述】:

谁能给我一个关于 TypeScript 和 Angular2 的猴子补丁示例以及解释?

【问题讨论】:

标签: javascript typescript angular


【解决方案1】:

因为 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}

更多:猴子补丁不仅仅是拦截

当您替换函数但保留原始行为时,它是函数拦截。是的,您使用猴子补丁进行函数拦截(替换函数),但调用原始函数不是猴子补丁的要求。

同样来自维基百科:https://en.wikipedia.org/wiki/Monkey_patch 一个明显替代原始行为的应用程序:

在运行时替换方法/类/属性/函数,例如在测试期间存根函数;

最后,仅仅因为你可以调用原版并不意味着你必须在猴子修补时调用原版

【讨论】:

  • 我不认为这是猴子补丁,只是重写了 Foo.b 函数
  • 更新了答案。此外,通常在继承的实例上进行覆盖(无直接突变)。
  • @Drenai 覆盖,在面向对象的意义上,意味着创建一个以原始对象为原型的新对象,并在新对象中重新定义方法。修补是修改现有对象和它作为原型的所有对象的行为,并替换原始方法 - 即使它(可选)调用原始方法,制作这样的补丁的全部意义在于改变行为无需修改正在使用的库的源代码等。
【解决方案2】:

接受的答案并不是monkey patching 的真正示例。这是一个覆盖函数的例子

monkey patching 的关键在于将original function 分配给一个变量(供以后使用),并用new function 替换/覆盖 - 但是new function 也必须致电original function

TypeScript Playground上的演示

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);

【讨论】:

  • 你通常只有return originalFunciton.apply(this);,添加到变量以使其更清晰
  • 不必调用原函数。猴子补丁经常会在某些情况下替换不同的行为(例如,检查传递的参数)来决定是调用原始补丁还是做其他事情。
猜你喜欢
  • 2011-01-14
  • 2010-09-29
  • 2019-09-07
  • 1970-01-01
  • 2016-09-01
  • 2012-09-16
  • 2012-12-18
  • 2020-01-09
  • 1970-01-01
相关资源
最近更新 更多