我有这个模块
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
我不得不承认,javascript的对象模型对我来说很混乱。我得到的错误是它无法识别函数MF.foreach
中的MFList
。我不太清楚实例如何使用这个模块模式,但如果有人能告诉我如何在对象的私有函数内调用MF.foreach
,我会很高兴的吗?谢谢!
答案 0 :(得分:3)
我得到的错误是它无法识别函数
MF.foreach
中的MFList
。
右。函数MF
没有名为foreach
的属性。通过函数MF
创建的对象有一个名为foreach
的属性(当你执行new
时,他们从原型中获取它们new MF(...)
运算符1}})。
如果您希望MF
本身具有该功能而不是由具有该功能的对象创建的对象,则需要更改
MF.prototype.foreach = ...
到
MF.foreach = ....
MF.prototype
用于设置通过new MF
创建的对象的原型;您放置的属性与MF
函数没有其他连接。
附注:我强烈建议重构MF
函数。你正在使用它作为构造函数,但有时它使用对象MF.prototype
作为原型返回对象,其他时它返回数组。这种不一致是个坏主意。当一个函数被设计为通过new
调用时(例如,它是构造函数函数),正常情况是它不会返回任何内容; new FunctionName
表达式的结果将是通过new
创建的对象。但是,如果构造函数返回非null
对象(例如当您返回数组时),则会覆盖new
表达式的正常结果。