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

关于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他还是可以实例化?


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"就输出啦

【热门文章】
【热门文章】