【问题标题】:getOwnPropertyDescriptor of redefined toString should be undefined重新定义的 toString 的 getOwnPropertyDescriptor 应该是未定义的
【发布时间】:2020-07-11 18:28:08
【问题描述】:

我重新定义了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 时自行返回代码。

【问题讨论】:

  • 为什么应该是undefined?每个自己的属性都有一个描述符。
  • @CertainPerformance 如果删除 defineProperty 块,您将看到它返回 undefined。所以很容易追踪到 toString 被重新定义了。
  • 如果您要添加一个以前不存在的属性,则无法从想要检查它的代码中隐藏它 - 他们可以看到描述符
  • 但是属性存在,如果你执行HTMLCanvasElement.prototype.toDataURL.toString()它会返回你的值。也许我以不正确的方式重新定义了属性?
  • 是的,属性存在,所以描述符是not undefined

标签: javascript html inheritance prototype prototypejs


【解决方案1】:

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

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

HTMLCanvasElement.prototype.toDataURL.toString 上不存在直接属性。但如果你自己添加一个,通过

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);
}

【讨论】:

    猜你喜欢
    • 2017-06-24
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2017-03-22
    相关资源
    最近更新 更多