Javascript模块模式问题

时间:2013-12-03 09:29:12

标签: 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 === '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,我会很高兴的吗?谢谢!

1 个答案:

答案 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表达式的正常结果。