![](/img/trans.png)
[英]Why does Object.getOwnPropertyDescriptor({}, '__proto__') return undefined?
[英]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.