2 回答

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊
這里的主要問(wèn)題是您直接返回querySelectororquerySelectorAll結(jié)果。您可以將其包裝在您自己的類中,您可以使用方法輕松擴(kuò)展該類。
class ElementsHelper {
constructor(elements) {
this.elements = elements;
}
// helper to simplify iterating `this.elements` and returning `this`
forEach(fn) {
this.elements.forEach(fn);
return this;
}
hide() {
return this.forEach(element => element.style.display = "none");
}
click(fn) {
return this.forEach(element => element.addEventListener("click", fn));
}
}
function $(selector) {
return new ElementsHelper(document.querySelectorAll(selector));
}
通過(guò)上述操作,您現(xiàn)在可以執(zhí)行以下操作:
$('#myDiv').hide();

TA貢獻(xiàn)1886條經(jīng)驗(yàn) 獲得超2個(gè)贊
你基本上有兩個(gè)選擇:
像 jQuery 一樣使用你自己的對(duì)象,或者
擴(kuò)展內(nèi)置原型。
返回每個(gè)單獨(dú)的結(jié)果對(duì)象時(shí)對(duì)其進(jìn)行擴(kuò)展
我可能會(huì)使用方法#1,也許是擴(kuò)展Array
(或通過(guò)組合使用數(shù)組)。
你似乎更喜歡方法#2。通常不建議這樣做,因?yàn)橐坏╅_(kāi)始組合來(lái)自多個(gè)位置的腳本,就會(huì)遇到潛在的沖突。但在應(yīng)用程序(而不是庫(kù))內(nèi),這不一定不合理。
在您的情況下,如果您的$
函數(shù)返回 的結(jié)果querySelectorAll
,它將返回 a?NodeList
,并且您可以擴(kuò)展NodeList.prototype
。每當(dāng)擴(kuò)展原型時(shí),始終使用Object.defineProperty
(或類似的)來(lái)定義不可枚舉的屬性。例如:
Object.defineProperty(NodeList.prototype, "hide", {
? ? value() {
? ? ? ? this.forEach(/*...*/);
? ? ? ? return this;
? ? },
? ? writable: true,
? ? configurable: true
});
實(shí)例:
Object.defineProperty(NodeList.prototype, "hide", {
? ? value() {
? ? ? ? // This isn't a great "hide", it's just for
? ? ? ? // the purposes of showing the plumbing
? ? ? ? this.forEach(el => el.style.display = "none");
? ? ? ? return this;
? ? },
? ? writable: true,
? ? configurable: true
});
const $ = selector => document.querySelectorAll(selector);
setTimeout(() => {
? ? $(".a").hide();
? ? console.log("Hid .a elements");
}, 800);
<div class="a">a</div>
<div class="b">b</div>
<div class="c">c</div>
不幸的是,
__proto__
現(xiàn)在已被棄用
這是真的,但Object.getPrototypeOf
不是,只是__proto__
訪問(wèn)器屬性(它只是為了向后兼容而添加到規(guī)范中)。
添加回答
舉報(bào)