2017-06-01 145 views
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修复

我应该至少得到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; 

}); 

排序在控制台作品:

命令:文件。 createElement('div')。dataset

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

它应该执行该功能。

编辑3

修改的代码,用value应该简单地是一个值,而不是一个函数。我将其更改为get,它需要一个函数并执行它。

  • 访问描述符 = +得到设定(见上面的例子)

    • 得到必须是一个函数;其返回值用于阅读财产;如果未指定,则缺省值未定义,其行为类似于返回未定义的函数
    • 集合必须是函数;其参数用RHS填充以赋予属性值;如果未指定,则默认为未定义的,它的行为就像一个空函数
  • 数据描述符 =值+写(见下面的示例)

    • 默认未定义;如果可写,可配置和可枚举(见下文)属实,则该属性的行为与普通数据字段相同
    • 可写 - default 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( '[数据菜单]')[0] .dataset 。菜单

+0

唐你想把它放在'HTMLElement'原型上吗? – 2017-06-01 12:09:53

+0

嗯,我确实认为它应该是,更新了我的代码 –

+1

' dataset'是一个属性,而不是一个函数。 – 2017-06-01 12:21:59

回答

3

使用Object.defineProperty

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

查看我更新的帖子。 –

+0

请参阅编辑2和建议吗? –

+0

@MartynBall你还在使用类似属性的功能... – evolutionxbox