Переопределить функцию набора данных

1

Может ли кто-нибудь посоветовать мне, как я могу переопределить функцию прототипа набора данных?

Это моя попытка:

if (document.createElement('div').dataset === undefined) {
  console.log('IE FIX');
  HTMLElement.prototype.dataset = function() {
    console.log('Fired?');
    this.menu = 'test';
  }
}

Я называю это так:

document.querySelectorAll('[data-menu]')[0].dataset.menu

В настоящее время все, что я получаю в консоли:

IE FIX

Я должен быть Fired? как минимум?

Изменить 2

См. Ниже код, это все еще не отображает console.log

document.addEventListener('DOMContentLoaded', function() {

  if (document.createElement('div').dataset !== undefined) {
    Object.defineProperty(
      HTMLElement.prototype,
      'dataset',
      {
        value: function () { console.log('dsada'); }
      }
    )
  }

  document.querySelectorAll('[data-menu]')[0].dataset;

});

Виды работ в консоли:

Команда: document.createElement('div'). Dataset

function () { console.log('dsada'); }

Однако он должен выполнять функцию.

Редактировать 3

Измененный код, используя value должен быть просто значением, а не функцией. Я изменил его, чтобы get который ожидает функцию и выполняет ее.

  • accessor descriptor= get + set (см. пример выше)

    • get должна быть функцией; его возвращаемое значение используется при чтении свойства; если не указано, значение по умолчанию не определено, которое ведет себя как функция, которая возвращает неопределенные
    • набор должен быть функцией; его параметр заполняется RHS при присвоении значения свойству; если не указано, значение по умолчанию не определено, которое ведет себя как пустая функция
  • data descriptor= значение + запись (см. пример ниже)

    • значение default undefined; если записываемые, настраиваемые и перечислимые (см. ниже) являются истинными, свойство ведет себя как обычное поле данных
    • writeable - false false; если это не так, свойство читается только; попытка записи игнорируется без ошибок *!

Ниже код отображает элемент правильно

document.addEventListener('DOMContentLoaded', function() {

  if (document.createElement('div').dataset !== undefined) {
    Object.defineProperty(HTMLElement.prototype, 'dataset', {
      get: function () {
        console.log(this);

      }
    })
  }

  document.querySelectorAll('[data-menu]')[0].dataset;

});

Мой вопрос сейчас, есть способ справиться с чем-то вроде:

document.querySelectorAll('[data-menu]')[0].dataset.menu

вот так:

if (document.createElement('div').dataset !== undefined) {
  Object.defineProperty(HTMLElement.prototype, 'dataset', {
    get: function () {
      console.log(this);
      this.getAttribute('data-' + this.arg);
    }
  })
}

Где это.

document.querySelectorAll('[data-menu]') [0].dataset .menu

Теги:

1 ответ

3
Лучший ответ

Используйте Object.defineProperty:

Object.defineProperty(
    HTMLElement.prototype,
    'dataset',
    {
        value: function () { /* whatever */ }
    }
)
  • 0
    Смотрите мой обновленный пост.
  • 0
    Смотрите Edit 2 и совет, пожалуйста?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню