簡體   English   中英

重新定義的 toString 的 getOwnPropertyDescriptor 應該是未定義的

[英]getOwnPropertyDescriptor of redefined toString should be undefined

我重新定義了HTMLCanvasElement.prototype.toDataURL toString 當我獲取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時返回代碼本身。

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方法,你可以覆蓋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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM