2016-03-30 78 views
0

我正在建立一個簡單的DOM實用程序庫,類似於jQuery是ES6。Object.assign this NodeList

class jQuery { 

    constructor(selector) {    
     let elements = document.querySelectorAll(selector); 
     Object.assign(this, elements); 
    } 
} 

let $ = selector => new jQuery(selector); 

console.log($('h1')); 

我試圖合併這與我的元素,這兩種類型都是對象,但結果它只是一個空對象(this)。

但是,如果我合併this{ foo: 'bar' }它的工作。

有人可以解釋我爲什麼會發生這種情況嗎?

住在https://jsbin.com/zupece/edit?js,console,output

+1

'Object.assign(this,{elements});'只是提供您分配arraylike – NaN

回答

1

我認爲NodeList不支持get它使用Object.assign你想讓它的方式。

你可以只將其指定爲一個複合:

class jQuery { 

    constructor(selectorOrElement) { 

     this.elements = selectorOrElement instanceof HTMLElement ? [selectorOrElement] : document.querySelectorAll(selector); 
    } 

    addClass(className) { 

     this.elements.forEach(function (element) { 

      element.classList.push(element); 
     }); 
    } 

    each(callback) { 

     for (var i = 0; i < this.elements.length; i++) { 

      var scope = this.elements[i]; 
      callback.call(scope, i, new jQuery(scope)); 
     } 
    } 
} 

這是更OOP反正。此外,各種JavaScript引擎現在可以嘗試優化您的代碼以獲得更好的性能。在使用Object.assign時,這是不太可能的。

+0

感謝您的答案 – Hiero

+0

但如果我不與合併構造函數,然後我不能訪問我的類中的其他方法,就像添加類\ – Hiero

+0

@Hroro Ofcourse你可以看到編輯。 – Tim