如何在保持相同API的同时将此JavaScript包装在立即调用的函数表达式(IIFE)中?
How do I wrap this JavaScript in an Immediately-Invoked Function Expression (IIFE) while maintaining the same API?
(纯粹是为了学习目的)我们正在实现JQuery的一些功能,并想知道如何在IIFE ("模块")中包装代码。
我们正在尝试实现的两个JQuery方法是addClass和removeClass,我们需要能够链接这些方法。
目前我们的代码工作:
var FAQuery = function(selector) {
this.id = selector.replace('#','');
this.elem = document.getElementById(this.id);
this.addClass = function(className) {
this.elem.className = this.elem.className + className;
return this;
}
this.removeClass = function(className) {
this.elem.className = this.elem.className.replace(className, '');
return this;
}
return this;
}
,然后以以下方式调用:
FAQuery('#div3').addClass('pass').removeClass('fail');
我们将如何在生活中包装它?
试试吧:http://morning-challenge.herokuapp.com/20150519.html
完整的代码与基于浏览器的单元测试: http://git.io/vTcRL
谢谢!
IIFE用于强制变量为局部变量而不是全局变量。但是,您已经导出了您想要的变量,因此IIFE在这里不会做太多事情。
也就是说,我可以推荐的一件事是将方法放在"原型"上,而不是将它们附加到每个实例上。
var FAQuery = function(selector) {
if(!(this instanceof FAQuery)){
return new FAQuery(selector);
}
this.id = selector.replace('#','');
this.elem = document.getElementById(this.id);
}
FAQuery.prototype.addClass = function(className) {
this.elem.className = this.elem.className + className;
return this;
}
FAQuery.prototype.removeClass = function(className) {
this.elem.className = this.elem.className.replace(className, '');
return this;
}
我还添加了一个带有instanceof检查的行,因此在创建FAQuery对象时不需要使用new
操作符。
相关文章:
- 调用正则表达式匹配的函数
- Javascript:应为赋值或函数调用,但实际看到的却是表达式
- 参数更改时,角度表达式中的函数不更新
- ES6是否引入了一种机制来生成块范围的函数语句(而不是表达式)
- 是否有任何Javascript函数从指定的索引中进行正则表达式匹配
- 能够在定义函数表达式之前使用它
- 函数表达式,返回回调函数
- JavaScript中的立即调用函数表达式(IIFE)-传递jQuery
- 函数声明与函数表达式之间的性能差异
- Javascript:JSHint:应为赋值或函数调用,但实际看到的却是表达式
- 立即调用函数表达式(IIFE)相对于普通函数的优势
- 如何通过jsp表达式标记将java字符串变量传递给javascript函数
- 用正则表达式在js中进行函数修剪
- 错误-应为赋值或函数调用,但实际看到的却是表达式
- Javascript错误正则表达式不是函数
- “期望赋值或函数调用,而是看到了表达式.” - 不必要的控制台.log
- 为过滤器创建javascript正则表达式函数
- 如何修复这个正则表达式函数
- 传递变量来替换正则表达式函数
- 正则表达式函数4个字母和4个数字