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

问题描述 投票:0回答:1

我已经重新定义了toStringHTMLCanvasElement.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时它将返回代码本身。

javascript html inheritance prototype prototypejs
1个回答
0
投票

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.