关于zepto源码里面实例化的问题。

最近在学习zepto的源码,遇到了一些问题,请教一下。这是一版zepto.js的源代码。(见链接)
链接描述
在它里面是这样实例化的。

zepto.Z = function(dom, selector) {
    return new Z(dom, selector)
  }

使用了new将类实例化。这个我理解。
但是我看过一版zepto,他是整体大概是这样写的。

/* 我是一个类 */
    var Klass = (function(){
        var $ = function(){};
        $.fn = $.prototype;
        $.fn = {
            map: function() {
                console.log("this is map");
            },
            param: "param"
        }
        var Z = function(){
            return $.fn;
        }
        return Z;
    })();

    window.Klass = Klass;
    '$' in window || (window.$ = Klass);
    // 执行函数
    $().map();//输出this is map

运行正常。但是我没想明白,为什么没有new他还是可以实例化?

阅读 2.7k
1 个回答
var Klass = (function(){
        var $ = function(){};
        $.fn = $.prototype;
        $.fn = {
            map: function() {
                console.log("this is map");
            },
            param: "param"
        }
        var Z = function(){
            return $.fn;
        }
        return Z;
    })();

执行完后,Klass指向闭包环境下的函数对象 Z,‘$’ in window || (window.$ = Klass); 因为$不为window的属性,所以(window.$ = Klass)被执行,此时 window.$指向Klass函数对象,也就是Klass闭包中的Z函数,$().map()就是执行Z().map(),Z函数返回$.fn,那么最终执行的就是$.fn.map函数,"this is map"就输出啦

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题