Почему свойства события не так легко получить? - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть следующий код ( ЗДЕСЬ - редактируемый пример - использование: введите в поле ввода и наблюдайте консоль):

function test(event) 
{	  
  let keys = Object.keys(event);
  let keysOwnProp = Object.getOwnPropertyNames(event);
  let keysForIn=[]; for(let k in event) { keysForIn.push(k); }


  console.log('keysForIn',keysForIn);
  console.log('keys',JSON.stringify(keys));
  console.log('keysOwnProp',JSON.stringify(keysOwnProp));
}
<input oninput="test(event)" placeholder="type something">

Вопросы :

  • Почему только в keysForIn я вижу все (?) Поля событий /свойства, но в keys и keysOwnProp только одно: isTrusted?
  • Есть ли альтернатива для keysForIn (если да, укажите ее)?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Здесь я копирую и вставляю Grégory NEUT ответ - который выглядит как лучший:

Object.keys(...) возвращает имена не перечисляемых символовсвойства объекта, но только те, которые не унаследованы.

For...in повторяет имена несимвольных перечисляемых свойств объекта, унаследованных или нет.

Object.getOwnPropertyNames(...)возвращает все несимвольные свойства (перечислимые или нет) .


Насколько мне известно, альтернативы for ... in для получения унаследованных свойств

нет

function displayDetail(o) {
  let keys = Object.keys(o);

  console.log('Object.keys > ', keys);

  let keysOwnProp = Object.getOwnPropertyNames(o);

  console.log('getOwnPropertyNames > ', keysOwnProp);

  const keysForIn = [];

  for (let k in o) {
    keysForIn.push(k);
  }

  console.log('for ... in > ', keysForIn);
}


/**
 * The basic object
 */
const obj = {
  own: 'A',
};

/**
 * We add a non enumerable property to the object
 */
Object.defineProperty(obj, 'notEnumerable', {
  enumerable: false,
  value: 123,
});

/**
 * We create a new object based on the first (it will inherit it's properties)
 */
const objWithInheritedProperties = Object.create(obj);

console.log('REGULAR OBJECT\n');
displayDetail(obj);

console.log('\n-----------\n');

console.log('OBJECT WITH INHERITANCE\n');
displayDetail(objWithInheritedProperties);
0 голосов
/ 29 ноября 2018

Кажется, Object.keys & Object.getOwnPropertyNames дает свойства, которые принадлежат исключительно объекту, тогда как цикл for..in также даст унаследованные свойства

document.getElementById('test').addEventListener('input', function(event) {
  let keys = Object.keys(event);
  let keysOwnProp = Object.getOwnPropertyNames(event);
  // location is one of the property which we get on using for..in
  console.log(event.hasOwnProperty('location'))
  let keysForIn = [];
  for (let k in event) {
    keysForIn.push(k);
  }
})
<input id="test">
...