2015-05-19 4 views
2

(только для учебных целей) мы реализуем несколько функций JQuery и хотели бы знать, как обернуть код в IIFE («модуль»).Как обернуть этот JavaScript в Expression Expression Expression (IIFE), поддерживая тот же API?

Два метода 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'); 

Как бы мы идти о оборачивать это в IIFE?

Попробуйте: http://morning-challenge.herokuapp.com/20150519.html
Полный код с браузерная блок тестирует: http://git.io/vTcRL

Спасибо!

+1

Что-то вроде этого: '(function() {this.FAQuery = function() {...};})();' – dfsq

+0

Хм ... увидев этот вопрос, я собирался [ссылаться на это ] (http://dfsq.info/site/read/writing-your-own-jquery) как полунаправленный, но @dfsq уже был здесь :) –

+0

Есть ли какая-то особая причина, по которой вы повторно компилируете this.elem в каждый метод вместо того, чтобы делать это один раз в начале? – hugomg

ответ

1

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, поэтому вам не нужно использовать оператор new при создании объекта FAQuery.