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

getOwnPropertyDescriptor of redefined toString should be undefined

我重新定义了 HTMLCanvasElement.prototype.toDataURLtoString。当我得到 toString 的 属性 描述符时,它应该 return undefined,但它 return 是函数。有什么解决办法吗?

你可以在这里执行代码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 块,您将看到它 returns undefined.

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

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

如果我没有重新定义 toString 它会在调用 toString 时 return 自己编码。

默认情况下,

HTMLCanvasElement.prototype.toDataURL 没有 own 属性 toString。通过引用 HTMLCanvasElement.prototype.toDataURL.toString 获得的 toString 方法原型继承自 Function.prototype.toString:

console.log(
  HTMLCanvasElement.prototype.toDataURL.toString === Function.prototype.toString
);

没有 属性 直接存在于 HTMLCanvasElement.prototype.toDataURL.toString 上。但是如果你自己添加一个,via

Object.defineProperty(HTMLCanvasElement.prototype.toDataURL, 'toString',

然后它有这样一个自己的属性,并且如果你检查它也会记录一个属性描述符。

如果您想在保持 HTMLCanvasElement.prototype.toDataURL.toString 为空的同时对您的自定义 toString 方法进行 monkeypatch,您可以覆盖 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);
}