我正在使用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函数接收到未定义数量的参数,但是哪些参数?在实例化过程中使用的那些 - 包括在上面的代码中?为什么这个函数是空的,它在调用时会做什么?
答案 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);