作者:天涯flyer_948 | 来源:互联网 | 2023-10-12 19:17
我正在尝试构建自己的小jquery类库,但是我正在创建这个链接模式的时间非常艰难.基本上我有一个类有一堆方法,可以更容易地操作文档.这是一个例子functionMF(selecto
我正在尝试构建自己的小jquery类库,但是我正在创建这个链接模式的时间非常艰难.基本上我有一个类有一堆方法,可以更容易地操作文档.这是一个例子
function MF(selector){
var DO; // Stands for DocumentObject
this.select = function(selector){
return document.getElementById(selector);
}
if(typeof selector === 'string'){
DO = this.select(selector);
}else if(selector instanceof HTMLElement){
DO = selector;
}
this.children = function children(selector){
return DO.getElementsByClassName(selector);
}
return {
MF: ???
}
}(null);
我的反思可能有问题,但我想弄清楚的是,为了获得文档对象(html元素)的其他方法,我需要扩展HTMLElement原型或者将元素与我的类一起传递.我选择了第二种选择.我只是无法弄清楚我的班级要回归什么,以便我可以继续进行链接.为了这个例子,我简单的目标是能够编写以下代码行:
MF('someDiv').children('someClass');
在绝望的尝试中,我尝试返回一个新的MF实例,默认情况下不应该有实例,并导致自己进入无限循环.我真的无法想象我应该回到那里.任何帮助是极大的赞赏!
解决方法:
看起来你也试图使用模块模式,并没有利用原型..
当你想链接某些东西时,你需要在可链接的方法中返回它自己(this),或者返回你的Object的新实例.在下面的例子中,我通过使用新实例来实现链接(好像孩子们看起来需要成为一个列表,所以我做了一个数组).
var MF = (function () { // module pattern start
function MF(selector) {
if (!(this instanceof MF)) return new MF(selector); // always construct
this.node = null; // expose your DO
if (typeof selector === 'string') {
this.node = document.getElementById(selector);
} else if (selector instanceof HTMLElement) {
this.node = selector;
} else {
throw new TypeError('Illegal invocation');
}
}
MF.prototype = {}; // set up any inheritance
MF.prototype.select = function (selector) {
return new MF(document.getElementById(selector)); // returns new instance
};
MF.prototype.children = function (selector) {
var MFs = [],
nodes = this.node.getElementsByClassName(selector),
i;
for (i = 0; i MFs[i] = new MF(nodes[i]);
}
return MFs; // array of items of new instances
};
return MF; // pass refence out
}()); // module pattern end
然后,例如,您可以链接…
MF(document.body).children('answer')[0].children('post-text')[0].node;