Маги c не нужны, чтобы видеть только это поведение: Object.keys
возвращает только собственные, перечисляемые свойства со строковыми именами. Любой объект JS может вести себя так, имея "background-color"
либо
- выше в цепочке прототипов, либо
- не перечисляемый.
Первое справедливо для "background-color"
для текущего Firefox, где это пара геттер / установщик для прототипа вычисляемого стиля:
console.log("background-color" in getComputedStyle(document.body));
console.log(
Object.getOwnPropertyDescriptor(CSS2Properties.prototype, "background-color"));
Chrome, кажется, использует маги c, где псевдонимы-дефисы являются перечислимыми свойствами, которые не перечислены.
for (let prop in document.body.style) {
if (prop === "background-color") {
console.log("found it");
}
}
console.log(Object.getOwnPropertyDescriptor(document.body.style, "background-color"));
Объекты, не являющиеся хостами, в частности прокси-серверы, все еще могут вести себя так же.
const magic = new Proxy({
"background-color": "red",
}, {
ownKeys(target) {
return [];
},
});
console.log(Object.keys(magic));
console.log(Object.getOwnPropertyDescriptor(magic, "background-color"));