覆盖数据集函数

时间:2017-06-01 12:03:40

标签: javascript

有人可以就如何覆盖数据集原型函数向我提出建议吗?

这是我到目前为止的尝试:

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,它需要一个函数并执行它。

  • 访问者描述符 = get + set(参见上面的示例)

    • 获取必须是一个功能;其返回值用于阅读财产;如果未指定,则默认值为undefined,其行为类似于返回undefined
    • 的函数
    • 设置必须是一个功能;在为属性赋值时,其参数由RHS填充;如果未指定,则默认值为undefined,其行为类似于空函数
  • 数据描述符 =值+可写(参见下面的示例)

    • 默认未定义;如果可写,可配置和可枚举(见下文)为真,则该属性的行为类似于普通数据字段
    • 可写 - 默认为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);
    }
  })
}

this.arg将在哪里

  

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

1 个答案:

答案 0 :(得分:3)

使用Object.defineProperty

Object.defineProperty(
    HTMLElement.prototype,
    'dataset',
    {
        value: function () { /* whatever */ }
    }
)