2012-04-05 4 views
0

Я только что создал небольшую фреймворк js, например, underscoer.js. Вызов метода осуществляется по mc_.grep([1,2,3,4], function(val){ return val > 2; });. Как я могу сделать его более похожим на стиль jQuery mc_(var).grep(func..).map(func..);? Есть идеи? А также, как я могу сделать библиотеку лучше?как сделать это как jquery?

https://github.com/awesomegamer/mc_-js-library

+0

Вам нужно будет выслать более полный код. Но это может быть лучше на codereview.stackexchange.com –

+0

Извините, я забыл включить свой код библиотеки. Я поднял ссылку github. – Lordking

+0

@lightning - именно так вы знаете, что касается вашего последнего сообщения, которое было опущено сегодня и которое вы удалили добровольно. Если вы возьмете соответствующий бит кода и вставьте его в свой вопрос, у читателей будет что-то впереди, чтобы помочь вам, и вы получите право на проведение «предшествующих исследований». Однако, если вы гиперссылки на репо (как и здесь), он дает читателям много кода для просеивания. Успокойте их, и сузите вопрос так сильно, как вы можете ':)'. Кроме того, вопросы, которые подвергаются параграфам, проверке орфографии и гиперссылкам по уценке, менее вероятно, будут уменьшены. – halfer

ответ

2
// Your function should return a wrapped object 
function Wrap(list) { 
    return Object.create(Wrap).constructor(list) 
} 

// set the list as an internal property 
Wrap.constructor = function (list) { 
    this._list = list 
    return this 
} 

// map function works in one of two ways, if it has an internal _list property 
// then it was called as Wrap(list).map(...) 
// then call the map function on it with the arguments 
// store the result as a new list as _list 
// return this so you can chain 
// 
// If it's not then it was used as Wrap.map(list, ...) 
// extract the arguments using [].slice(arguments, 1) 
// then return the result of invoking it 
Wrap.map = function (list) { 
    if (this._list) { 
     this._list = this._list.map.apply(this._list, arguments) 
     return this 
    } else { 
     return list.map.apply(list, [].slice.call(arguments, 1)) 
    } 
} 

// Wrappers need an unwrap method 
// Wrap(list).map(...).filter(...).reduce(...).get() 
Wrap.get = function() { 
    return this._list 
} 
+0

+1, но какое-то объяснение для ОП было бы замечательным –

+0

Почему он не читает код и просто его понимает, проверяя :( – Raynos

+0

OP, вероятно, может понять это путем проверки, но понимание того, как работает код, не дает полного понимания _why_ вы сделали это таким образом. –

3

Если вы имеете в виду, что вы хотите цепочку вызовов функций каждый раз, когда вы вернетесь из функции вы должны вернуться вы должны вернуть то, что обернет внутри основного объекта, который находится в самом сердце вашей структуры так что вы можете вызвать следующий метод для возвращаемого объекта.

Например (это очень обычная) $('#someid') вызов возвращается, как это с помощью JQuery

this.length = 1; 
    this[0] = elem; 
} 

this.context = document; 
this.selector = selector; 
return this; 
1

Там хорошая статья доступна на википедии называемых "Method chaining".

упрощенно пример цепочки, также как working jsfiddle (просто откройте консоль с F12, чтобы увидеть результат) будет выглядеть следующим образом:

var a = { 
    b: function() { 
     console.log('b'); 
     // Make method chainable: 
     return this; 
    }, 
    c: function() { 
     console.log('c'); 
     // Make method chainable: 
     return this; 
    } 
}; 

// Now you can do: 
a.b().c();​ 

Я рекомендую взглянуть на annotated source code of underscore.js чтобы избежать чувства «О, черт, я потратил столько времени, изобретая колесо».

Как улучшить? Есть только один способ, который я знаю: сделайте его полезным.

+0

Я использую подчеркивание, но я хотел создать свою собственную для практических целей. Thnx для ответа! – Lordking

Смежные вопросы