【发布时间】:2020-07-11 18:28:08
【问题描述】:
我重新定义了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 时自行返回代码。
【问题讨论】:
-
为什么应该是
undefined?每个自己的属性都有一个描述符。 -
@CertainPerformance 如果删除
defineProperty块,您将看到它返回undefined。所以很容易追踪到 toString 被重新定义了。 -
如果您要添加一个以前不存在的属性,则无法从想要检查它的代码中隐藏它 - 他们可以看到描述符
-
但是属性存在,如果你执行
HTMLCanvasElement.prototype.toDataURL.toString()它会返回你的值。也许我以不正确的方式重新定义了属性? -
是的,属性存在,所以描述符是not
undefined
标签: javascript html inheritance prototype prototypejs