空函数“function(){}”如何在JS对象构造函数中工作?

时间:2014-06-17 10:39:15

标签: javascript constructor prototype

我正在使用Alex MacCaw的Javascript Web应用程序学习原型,类和模块化模式。几乎所有内容都清晰且解释清楚,但是,我无法弄清楚用于初始化的空函数是如何工作的。如果您解释细微差别,无论它们有多复杂,我将不胜感激。

以下是本书的例子:

 (function($){
    var mod = {};
    mod.create = function(includes){
        var result = function(){
            this.init.apply(this, arguments);
        };
        result.fn = result.prototype;
        result.fn.init = function(){};
        result.proxy = function(func){ return $.proxy(func, this); };
        result.fn.proxy = result.proxy;
        result.include = function(ob){ $.extend(this.fn, ob); };
        result.extend = function(ob){ $.extend(this, ob); };
        if (includes) result.include(includes)
        return result;
    };
    exports.Controller = mod;
})(jQuery);

从上面的代码中我了解到,立即调用函数表达式(IIFE)用于保护范围。然后定义mod.create构造函数,返回带有所有类方法的结果对象。但是,我对跟随的工作原理感到困惑:

     this.init.apply(this, arguments);
 result.fn.init = function(){};

我想我们将空的init函数应用于构造函数参数以允许新对象实例化或类似的东西。从下面的答案看来,init函数接收到未定义数量的参数,但是哪些参数?在实例化过程中使用的那些 - 包括在上面的代码中?为什么这个函数是空的,它在调用时会做什么?

1 个答案:

答案 0 :(得分:1)

this.init.apply(this, arguments);

基本上只是

this.init(arguments[0], arguments[1], ..., arguments[N]);

但是,一旦我们不知道参数的确切数量,我们就会使用.apply()

用法示例:

var newConstructor = exports.Controller.create();
newConstructor.include({
    init: function(a, b, c) { console.log(a, b, c, 'yay!'); }
});

var newInstance = new newConstructor(1, 2, 3);

完整演示:http://jsfiddle.net/nbq6d/1/