如何向内置原型的属性中注入或添加方法?

时间:2018-12-02 03:29:01

标签: javascript dom

前言:我知道以下要求可能是某种误用或不良做法,但我只是想知道可能的实现。)

classList具有方法add()remove(),因此类似地,我想使用“包装器”功能向其添加其他自定义方法-添加或删除{{ 1}}元素及其所有特定子元素({{1}) -分别通过方法className[data-css-alter]。我希望可以使用以下子句调用自定义方法:

allAdd()

我试图将allDel()用作“包装器”(只是为了方便我的自定义方法的集中管理),并尝试将elem.classList.allAdd(className) elem.classList.allDel(className) 用作入口点。

但是我无法访问Object.defineProperties并出现错误

Element.prototype

到目前为止,尽管无需附加Element.prototype.classList也可以达到相同的效果,但是调用方法不是我想要的,代码如下:

Uncaught TypeError: Illegal invocation

用法:

Element.prototype.classList

实际上是

Object.defineProperties(Element.prototype, {
  "cssAll": {
    get() {

      function cssAlter(act, className = null, attr = "[data-css-alter]") {
        this.classList[act](className)
        Array.from(this.querySelectorAll(attr))
             .forEach(child => child.classList[act](className))
      }

      return {
        add: (className, attr) => cssAlter.call(this, "add", className, attr),
        remove: (className, attr) => cssAlter.call(this, "remove", className, attr)
      }

    }
  }
})

但是我想要的方式是直接调用本机方法:

elem.cssAll.add(className)
elem.cssAll.remove(className)

所以请帮助我,非常感谢!

0 个答案:

没有答案