如何在纯JavaScript中重写本机JS函数(canvas';s getContext())?

如何在纯JavaScript中重写本机JS函数(canvas';s getContext())?,javascript,html5-canvas,overriding,Javascript,Html5 Canvas,Overriding,我想在canvas元素调用“getContext('webgl')”时,返回“null”值 我试图找到WebGLRenderingContextprototype并对其进行更新,但找不到它 WebGLRenderingContext和WebGLRenderingContextBase没有prototype.getContext 如何将其更改为“null”值 我已经在下面测试过了 var test = document.createElement('canvas');` test.getConte

我想在canvas元素调用“getContext('webgl')”时,返回“null”值

我试图找到
WebGLRenderingContext
prototype并对其进行更新,但找不到它

WebGLRenderingContext
WebGLRenderingContextBase
没有
prototype.getContext

如何将其更改为“null”值

我已经在下面测试过了

var test = document.createElement('canvas');`
test.getContext("webgl");`
这将返回
WebGLRenderingContext
对象


请帮助我:)

搞乱原生原型?我想你知道你在做什么。如果是这样,并且您确实想要覆盖
getContext
prototype方法,那么您可以使用
htmlcanvaseelement.prototype.getContext
的简单装饰器来实现这一点:

HTMLCanvasElement.prototype.getContext = function (orig) {
  return function(type) {
    return type !== "webgl" ? orig.apply(this, arguments) : null
  }
}(HTMLCanvasElement.prototype.getContext)

因此,对于2d、3d等任何上下文,它都可以正常工作,但对于“webgl”,它将给出
null
。不知道您为什么需要它。

不确定您为什么要这样做,但假设您确切知道自己在做什么™ 您可以这样做:

//存储对原始向量的引用
HTMLCanvasElement.prototype.\uu oldGetContext=HTMLCanvasElement.prototype.getContext;
//补丁
HTMLCanvasElement.prototype.getContext=函数(类型、选项){
如果(类型==“webgl”| |类型==“实验性webgl”){
console.log(“WebGL已抑制!”);//在生产中删除此项
返回null;
}
否则返回此值。uuu oldGetContext(类型,选项);//调用原始向量
}
//测试(假设浏览器确实支持*webgl…)
var c=document.createElement(“画布”);
var ctx=c.getContext(“webgl”)| | c.getContext(“实验webgl”);
//使用2D
var c2=document.createElement(“画布”);
var ctx2=c2.getContext(“2d”);

控制台日志(“2d?”,!!ctx2)谢谢你的帮助!我尝试过,但失败了,这是我的chrome版本问题。感谢还有其他类型的webgl,如
webgl2
实验性webgl
。所以我使用了这个条件并对我起作用:
returntype.indexOf('webgl')>=0?null:orig.apply(这个,参数)谢谢。我想知道真正的实现以及如何更改它。@N.hwang主要的关键是在任何使用getContext()的脚本之前运行它。您可以将其粘贴为标题中的脚本块,例如。@N.hwang如果您顺便说一句,在本机浏览器代码中,您必须使用浏览器源代码,找到代码位置,相对于代码进行必要的修改,重新编译。。。我不推荐,只是以防万一,如果这是你的意思。一个更好的方法可能是为浏览器制作一个插件,对你加载的每个页面进行修改,或者使用类似于FF的东西。谢谢!我有个问题。。嗯..当我在重定向页面中调用'getContext'时,它不起作用..我想..因为HtmlCanvaElement最上面的父元素是'document',所以重定向时会重新加载文档。。是这样吗?文档->元素->HTML元素->HTMLCanvasElement@N.hwang是的,当加载新文档时,修改会丢失。代码需要应用于加载的每个新文档。插件可以做到这一点,但当然需要每个用户都安装插件——或者如果您有权修改这些文档,您可以将脚本应用于每个用户(例如,您可以制作一个小框架,其中嵌入了画布使用的所有代码以及初始修改。然后只需为使用该框架的每个页面链接到此框架)。