如何全局覆盖HTMLElement本机方法?

时间:2017-08-29 19:14:51

标签: javascript function override native

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

我的目标是所有svg元素对此方法的所有调用都将调用我的包装函数,该函数将打印一些东西,然后委托给原始的本机实现。

以下是我的尝试:

<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/

我该如何做到这一点?

1 个答案:

答案 0 :(得分:3)

你可能正在扩展错误的元素,看起来你有一个$text | Select-Xml -XPath '//Report[@category="thisone"]//String'|%{$_.Node.'#text'} | Tee-Object -FilePath C:\Path\To\NewFile.txt

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值才能成为实际的SVG元素。
不过,您可以使用thisapply

来调用它