2017-06-01 146 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