(前言:我知道以下要求可能是某种误用或不良做法,但我只是想知道可能的实现。)
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)
所以请帮助我,非常感谢!