gpt4 book ai didi

javascript - 重新定义的 toString 的 getOwnPropertyDescriptor 应该是未定义的

转载 作者:行者123 更新时间:2023-12-02 21:16:49 24 4
gpt4 key购买 nike

我重新定义了 HTMLCanvasElement.prototype.toDataURLtoString。当我获取 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 block ,您将看到它返回 undefined

我通过下一个代码重新定义了toDataURL:

Object.defineProperty(HTMLCanvasElement.prototype, 'toDataURL', {
value: function () { return 'new valu' }
});

如果我没有重新定义toString,它将在调用toString时返回代码本身。

最佳答案

默认情况下,

HTMLCanvasElement.prototype.toDataURL 没有自己的属性toString。通过引用 HTMLCanvasElement.prototype.toDataURL.toString 获得的 toString 方法原型(prototype)继承自 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.

请注意,虽然这在技术上是可行的,但这样做也很奇怪,并且改变内置原型(prototype)是一个坏主意:

const origToString = Function.prototype.toString;
Function.prototype.toString = function() {
if (this === HTMLCanvasElement.prototype.toDataURL) return 'function toDataURL() { [native code] }';
else return origToString.call(this);
}

关于javascript - 重新定义的 toString 的 getOwnPropertyDescriptor 应该是未定义的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60946604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com