【问题标题】:Object.assign this with NodeListObject.assign this 与 NodeList
【发布时间】:2016-07-18 23:18:53
【问题描述】:

我正在构建一个简单的 DOM 实用程序库,类似于 jQuery 是 ES6。

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

【问题讨论】:

  • Object.assign(this, {elements}); 只需为您分配的数组提供一个键

标签: javascript jquery ecmascript-6 babeljs


【解决方案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 时,这种可能性要小得多。

【讨论】:

  • 但是如果我不与构造函数合并,那么我就无法访问我的类中的其他方法,比如添加类\
  • 如果我想做 $('h1').each(function(el) { el.addClass('test') }); dosent 工作,jquery 是如何访问 $(this) 的?
  • @Hiero 查看编辑,这将适用于您的建议。
  • instanceof HtmlElement 可能会在其他节点或不支持此接口的浏览器中失败。而是测试选择器,您知道它是一个字符串。此外,您应该使用for of 循环而不是forEach
  • 我检查选择器是否有nodeType,它更安全
猜你喜欢
  • 2019-08-22
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 2015-12-31
相关资源
最近更新 更多