Почему свойства объекта XMLHttpRequest можно печатать только через console.log ()? - PullRequest
0 голосов
/ 24 мая 2018
var obj = new XMLHttpRequest();
console.log("Object.keys():",Object.keys(obj));
console.log("Object.getOwnPropertyNames():",Object.getOwnPropertyNames(obj))
console.log("Object.entries():",Object.entries(obj))
console.log("JSON.stringify():",JSON.stringify(obj))

console.log("console.log:"); console.log(obj)

вывод:

Object.keys (): []
Object.getOwnPropertyNames (): []
Object.entries (): []
JSON.stringify (): {}
console.log:
XMLHttpRequest {onreadystatechange: null, readyState: 0, время ожидания: 0, withCredentials: false, загрузка: XMLHttpRequestUpload,…}

Как я могу создать такой объект в javascript, свойства которого печатаются только с использованием console.log(), но не возвращаются любым из вышеуказанных функций?

Я уже пытался создать объектыиспользуя constructor function, object.create()enumerable:false), Object.assign(), используя getters, выделение из класса, выделение из расширенного класса и т. д.

1 Ответ

0 голосов
/ 24 мая 2018

Вы можете сделать что-то вроде этого:

Object.defineProperty(obj, 'key', {
    enumerable: false,
    value: '123'
});

В частности, enumerable thingie скрывает свойство.

Для получения дополнительной информации см. Эту страницу: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

ОБНОВЛЕНИЕ:

Следующий подход (улучшенная версия вышеупомянутого), кажется, скрывает свойства от всех упомянутых проверок, хотя это немного многословно:

var proto = {};
Object.defineProperty(proto, "key", {
    get: function () { return 123; }
});

var obj = Object.create(proto);

console.log(obj); // {}
console.log(Object.getOwnPropertyNames(obj)); // []
console.log(obj.key); // 123
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...