2012-04-05 53 views
0

我剛剛創建了一個像underscoer.js這樣的小型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 – 2012-04-05 13:13:51

+0

對不起,我忘了包括我的庫代碼。我搭起了github鏈接。 – Lordking 2012-04-05 13:55:29

+0

@lightning - 就您所知,關於您今天下調的最近發佈的帖子,以及您自願刪除的帖子。如果您抓住相關的代碼並將其插入到您的問題中,讀者將在他們面前獲得幫助,並且您有資格完成「事先研究」。但是,如果你超鏈接到一個回購(也在這裏),它給讀者提供了很多代碼來篩選。讓它們變得容易,儘可能地縮小問題的範圍':)'。除此之外:被分類,拼寫檢查和降價超鏈接的問題不太可能被低估。 – halfer 2012-05-06 09:41:11

回答

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,但對OP的一些解釋會很好 – 2012-04-05 13:58:01

+0

爲什麼他沒有閱讀代碼,並通過檢查瞭解它:( – Raynos 2012-04-05 13:59:40

+0

OP可能可以通過檢查瞭解它,但瞭解代碼的工作原理並不能完全瞭解_Why_你這樣做了。 – 2012-04-05 14:03:14

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 2012-04-05 23:33:35