Javascript模块模式问题
我有这个模块Javascript模块模式问题,javascript,Javascript,我有这个模块 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 ===
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') {
switch (selector.substring(0, 1)) {
case '#':
this.node = document.getElementById(selector.substring(1));
break;
case '.':
this.node = document.getElementsByClassName(selector.substring(1).replace('.', ' '));
break;
default :
this.node = document.getElementsByTagName(selector);
break;
}
if (this.node.length > 1) {
return MFList(this.node);
} else if (typeof this.node.length !== 'undefined') {
return MF(this.node[0]);
}
} else if (selector instanceof HTMLElement) {
this.node = selector;
}
}
function isArraylike(obj) {
var length = obj.length;
return (length === 0 || typeof length === "number" && length > 0 && (length - 1) in obj);
}
function MFList(List) {
var _List = [];
MF.foreach(List, function(k, v) {
_List[k] = new MF(v);
});
return _List.length > 0 ? _List : false;
};
MF.prototype.foreach = function(obj, callback) {
var value,
i = 0,
isArray = isArraylike(obj);
if (isArray) {
var length = obj.length;
for (; i < length; i++) {
value = callback.call(obj[ i ], i, obj[ i ]);
if (value === false) {
break;
}
}
} else {
for (i in obj) {
value = callback.call(obj[ i ], i, obj[ i ]);
if (value === false) {
break;
}
}
}
return obj;
}
return MF; // pass refence out
}()); // module pattern end
var MF=(函数(){//模块模式开始
功能MF(选择器){
如果(!(此MF实例))
返回新MF(选择器);//始终构造
this.node=null;//公开您的DO
如果(选择器的类型=='string'){
开关(选择器子串(0,1)){
案例“#”:
this.node=document.getElementById(selector.substring(1));
打破
案例“”:
this.node=document.getElementsByClassName(selector.substring(1).replace('.','');
打破
违约:
this.node=document.getElementsByTagName(选择器);
打破
}
如果(this.node.length>1){
返回MFList(本节点);
}else if(typeof this.node.length!=“未定义”){
返回MF(此.node[0]);
}
}else if(HtmleElement的选择器实例){
this.node=选择器;
}
}
函数isArraylike(obj){
变量长度=对象长度;
返回值(长度===0 | | typeof长度===“number”&&length>0&&length(长度-1)(在obj中);
}
功能列表(列表){
var_List=[];
MF.foreach(列表,函数(k,v){
_列表[k]=新MF(v);
});
返回_List.length>0?_List:false;
};
MF.prototype.foreach=函数(obj,回调){
var值,
i=0,
isArray=isArraylike(obj);
如果(isArray){
变量长度=对象长度;
对于(;i
我必须承认,javascript的对象模型对我来说相当混乱。我得到的错误是,它无法识别函数MFList
中的MF.foreach
。我不太清楚实例如何使用这个模块模式,但是如果有人能告诉我如何在对象的私有函数中调用MF.foreach
,我会非常高兴的?谢谢
我得到的错误是,它无法识别函数MFList
中的MF.foreach
对。函数MF
没有名为foreach
的属性。通过函数MF
创建的对象有一个名为foreach
的属性(当您执行new MF(…)
操作时,它们从原型中获取该属性,并通过new
操作符进行分配)
如果您希望MF
本身具有该函数,而不是由它创建的具有该函数的对象,那么您需要更改
MF.prototype.foreach = ...
到
MF.prototype
用于设置通过new MF
创建的对象的原型;您在此处放置的属性与MF
函数没有其他连接
旁注:我强烈建议重构
MF
函数。您将其用作构造函数,但有时它返回对象时使用对象MF.prototype
作为其原型,有时返回数组。这种不一致是个坏主意。当一个函数被设计为通过new
调用时(例如,它是一个构造函数),正常情况是它不返回任何东西;newfunctionname
表达式的结果将是通过new
创建的对象。但是,如果构造函数返回一个非null
对象(例如当您返回数组时),则会覆盖new
表达式的正常结果
我得到的错误是,它无法识别函数MFList
中的MF.foreach
对。函数MF
没有名为foreach
的属性。通过函数MF
创建的对象有一个名为foreach
的属性(当您执行new MF(…)
操作时,它们从原型中获取该属性,并通过new
操作符进行分配)
如果您希望MF
本身具有该函数,而不是由它创建的具有该函数的对象,那么您需要更改
MF.prototype.foreach = ...
到
MF.prototype
用于设置通过new MF
创建的对象的原型;您在此处放置的属性与MF
函数没有其他连接
旁注:我强烈建议重构
MF
函数。您将其用作构造函数,但有时它返回对象时使用对象MF.prototype
作为其原型,有时返回数组。这种不一致是个坏主意。当一个函数被设计为通过new
调用时(例如,它是一个构造函数),正常情况是它不返回任何东西;newfunctionname
表达式的结果将是通过new
创建的对象。但是,如果构造函数返回一个非null
对象(例如当您返回数组时),则会覆盖new
表达式的正常结果
我得到的错误是,它无法识别函数MFList
中的MF.foreach
对。函数MF
没有名为foreach
的属性。通过函数MF
创建的对象有一个名为foreach
的属性(当您执行new MF(new
操作时,它们从原型中获取该属性,并通过new
操作符进行分配)。