2017-08-29 20 views
2

我想包装一个为所有SVGElements实现的函数,称为getScreenCTM如何覆盖全局的HTMLElement本机方法?

我的目标是,所有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/

我怎样才能做到这一点?

回答

3

你可能会延长错误的元素,看起来就像你有一个​​

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