javascript - 如何全局重写 HTMLElement 原生方法?

标签 javascript function overriding native

我正在尝试包装一个为所有 SVGElements 实现的名为 getScreenCTM 的函数。 .

我的目标是所有 svg 元素对此方法的所有调用都将调用我的包装函数,该函数将打印一些内容,然后委托(delegate)给原始的 native 实现。

这是我尝试过的:

<svg id="a"></svg>

window.nativeGetScreenCTM = SVGElement.prototype.getScreenCTM;

SVGElement.prototype.getScreenCTM = function() {
  var matrix = window.nativeGetScreenCTM();
  console.log('printing something:');
  return matrix;
};

var svgElem = document.getElementById('a');

svgElem.getScreenCTM();

但是当执行最后一行时,没有打印任何内容。原文getScreenCTM被调用而不是我的包装器实现。

您可以在这里使用它:https://jsfiddle.net/zwxr2c9k/1/

我怎样才能做到这一点?

最佳答案

您可能扩展了错误的元素,看起来您有一个 SVGGraphicsElement

window.nativeGetScreenCTM = SVGGraphicsElement.prototype.getScreenCTM;

SVGGraphicsElement.prototype.getScreenCTM = function() {
  var matrix = window.nativeGetScreenCTM.apply(this, arguments);
  console.log('printing something:');
  return matrix;
};

var svgElem = document.getElementById('a');

svgElem.getScreenCTM();
<svg id="a"></svg>

另请注意,您不能只调用 window.nativeGetScreenCTM,因为它要求 this 值是实际的 SVG 元素。
但是,您可以使用 applycall

来调用它

关于javascript - 如何全局重写 HTMLElement 原生方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45946746/

相关文章:

javascript - 需要上一个调用的响应的多个 AJAX API 调用的最佳实践?

php - 数据库访问最佳实践指南

c - 如何在函数静态中保持值数组?

C:创建一款游戏,但在某些情况下我遇到了一个错误和无限循环错误

ios - Swift 覆盖子类中的协议(protocol)方法

javascript - 使用 jscript 检测 exe 的版本和公司名称

javascript - 使用 Javascript 从 Qt WebView 获取文本

r - 有人能告诉我为什么 R 没有将整个 data.frame 用于这个 chisq.test 吗?

ReactJS 沿层次结构覆盖或编辑上下文

java - 重写泛型类的方法时发生名称冲突