我剛剛創建了一個像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
我剛剛創建了一個像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
// 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
}
+1,但對OP的一些解釋會很好 – 2012-04-05 13:58:01
爲什麼他沒有閱讀代碼,並通過檢查瞭解它:( – Raynos 2012-04-05 13:59:40
OP可能可以通過檢查瞭解它,但瞭解代碼的工作原理並不能完全瞭解_Why_你這樣做了。 – 2012-04-05 14:03:14
如果你的意思是你想鏈中的函數調用每次你從一個函數返回時,你必須返回你必須返回的東西,被包裹的基本對象,它是在你的框架的心臟使內您可以調用返回對象上的下一個方法。
例如(這是很基本的)的$('#someid')
調用返回這樣的jQuery
this.length = 1;
this[0] = elem;
}
this.context = document;
this.selector = selector;
return this;
有維基百科上稱爲"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考慮看看爲了避免感覺「哦,該死的,我花了那麼多時間重塑了一個輪子」。
如何改進?只有一種方法我知道:讓它有用。
我確實使用了下劃線,但我想創建一個屬於我自己的練習目的。Thnx的回覆! – Lordking 2012-04-05 23:33:35
你需要發佈更完整的代碼。但是這可能會更好codereview.stackexchange.com – 2012-04-05 13:13:51
對不起,我忘了包括我的庫代碼。我搭起了github鏈接。 – Lordking 2012-04-05 13:55:29
@lightning - 就您所知,關於您今天下調的最近發佈的帖子,以及您自願刪除的帖子。如果您抓住相關的代碼並將其插入到您的問題中,讀者將在他們面前獲得幫助,並且您有資格完成「事先研究」。但是,如果你超鏈接到一個回購(也在這裏),它給讀者提供了很多代碼來篩選。讓它們變得容易,儘可能地縮小問題的範圍':)'。除此之外:被分類,拼寫檢查和降價超鏈接的問題不太可能被低估。 – halfer 2012-05-06 09:41:11