我已经重新定义了toString
的HTMLCanvasElement.prototype.toDataURL
。当我获得toString
的属性描述符时,它应该返回undefined
,但它返回函数。有任何解决办法吗?
您可以在此处执行代码https://jsfiddle.net/nqk50a8r/
Object.defineProperty(HTMLCanvasElement.prototype.toDataURL, 'toString', {
value: function () { return 'function toDataURL() { [native code] }';}
});
var desc = Object.getOwnPropertyDescriptor(HTMLCanvasElement.prototype.toDataURL, 'toString');
console.log(desc === undefined);
如果删除了defineProperty
块,您将看到它返回undefined
。
我用下一个代码重新定义了toDataURL
:
Object.defineProperty(HTMLCanvasElement.prototype, 'toDataURL', {
value: function () { return 'new valu' }
});
如果我不重新定义toString
,则在调用toString
时它将返回代码本身。
HTMLCanvasElement.prototype.toDataURL
默认情况下没有own属性toString
。通过引用toString
获得的HTMLCanvasElement.prototype.toDataURL.toString
方法原型上是从Function.prototype.toString
继承的:
console.log(
HTMLCanvasElement.prototype.toDataURL.toString === Function.prototype.toString
);
HTMLCanvasElement.prototype.toDataURL.toString
上没有直接存在的属性。但是,如果您自己添加一个,可以通过]
具有这样一个自己的属性,并且如果您对其进行检查,还将记录一个属性描述符。Object.defineProperty(HTMLCanvasElement.prototype.toDataURL, 'toString',
然后它将
如果要在保留toString
为空的同时猴子化自定义HTMLCanvasElement.prototype.toDataURL.toString
方法,则可以覆盖Function.prototype.toString
。
请注意,尽管这在技术上是可行的,但这样做也很奇怪,并且对内置原型进行突变是一个坏主意:
const origToString = Function.prototype.toString;
Function.prototype.toString = function() {
if (this === HTMLCanvasElement.prototype.toDataURL) return 'function toDataURL() { [native code] }';
else return origToString.call(this);
}