Я пытаюсь проверить, есть ли у документа свойство «hidden», используя document.hasOwnProperty, но всегда возвращает false в Chrome (74).

Я пробовал Object.prototype.hasOwnProperty, но это тоже возвращает false. Когда я попытался структурировать и проанализировать обратно документ, я получил объект Location как свойство.

console.log(document.hasOwnProperty("hidden"));
console.log(Object.prototype.hasOwnProperty.call(document, "false"));
console.log(JSON.parse(JSON.stringify(document)));
console.log(typeof document.hidden !== "undefined");
console.log(document.hidden);
console.log(Document.prototype.hasOwnProperty.call(document, "hidden"));
console.log(Document.prototype.hasOwnProperty.call(document, "location"));

Разве hasOwnProperty не должен проверять, есть ли у объекта свойство независимо от типа объекта? Я прошу прощения, если на вопрос уже был дан ответ.

0
shrys 29 Май 2019 в 14:12

2 ответа

Лучший ответ

Цель hasOwnProperty() проверяет, определено ли определенное свойство в самом экземпляре и не наследуется ли оно через prototype.

В случае document он по праву возвращает false, поскольку свойство hidden фактически определяется в интерфейсе Document, а не в самом экземпляре.

(спасибо @Jonas Wilms за разъяснения)

2
haim770 29 Май 2019 в 11:56

Копирование и исправление удаленного ответа @ haim770 на данный момент:

Цель hasOwnProperty() проверяет, определено ли определенное свойство в самом объекте и не унаследовано ли оно через prototype.

В случае document он по праву возвращает false, поскольку свойство hidden фактически определено в [Document], а не в самом [объекте документа].

console.log('' + Object.getPrototypeOf(document));
console.log('' + Object.getPrototypeOf(Object.getPrototypeOf(document)));

console.log(document.__proto__.__proto__.hasOwnProperty('hidden'));

console.log(Object.getOwnPropertyDescriptor(Document.prototype, 'hidden'));
1
Ry- 29 Май 2019 в 11:34