Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript模块模式问题_Javascript - Fatal编程技术网

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
操作符进行分配)。