Основной (но отнюдь не надежный) метод заключается в проверке, состоит ли функция из собственного кода.Если нет, то он определенно был обезьянат;если это так, то если он был обезьянечным, у него также был целенаправленно изменен метод toString
, чтобы избежать такого рода обнаружения (что возможно, но, вероятно, довольно необычно):
const checkValid = () => {
const { appendChild } = Node.prototype;
if (appendChild.toString() === `function appendChild() { [native code] }`) {
document.write('Might not have been modified<br>');
} else {
document.write('Definitely modified<br>');
}
};
checkValid();
Node.prototype.appendChild = () => {
console.log('My monkeypatched function');
};
checkValid();
// Check is foolable via:
const fooler = function appendChild() {
console.log('My monkeypatched function');
};
fooler.toString = () => `function appendChild() { [native code] }`;
Node.prototype.appendChild = fooler;
checkValid();
Подобно методу HTMLElement.prototype.appendChild ()
Объект, к которому appendChild
непосредственно подключен, равен Node.protoype.
Еслиmonkeypatcher поместил его на HTMLElement.prototype
(или на сам элемент), это легко обнаружить:
const div = document.querySelector('div');
if (HTMLElement.prototype.hasOwnProperty('appendChild')) {
console.log('Definitely modified');
}
if (div.appendChild !== Node.prototype.appendChild) {
console.log('Definitely modified');
}
<div></div>