Skip to content

Commit 6fee1bd

Browse files
committed
Merge pull request #25 from azu/jQuery-how-to-work
jQueryプラグインの実装の仕組み close #8
2 parents 1598094 + d6dc4cd commit 6fee1bd

File tree

1 file changed

+58
-2
lines changed

1 file changed

+58
-2
lines changed

Diff for: ja/jQuery/README.md

+58-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# jQueryのPlugin
1+
# jQuery
22

33
jQueryでは`$.fn`を拡張する事で、`$()`の返り値であるjQueryオブジェクトにメソッドを追加することが出来ます。
44

@@ -15,6 +15,46 @@ jQueryでは`$.fn`を拡張する事で、`$()`の返り値であるjQueryオブ
1515

1616
## どういう仕組み?
1717

18+
このjQueryプラグインがどのような仕組みで動いているのかを見てみましょう。
19+
20+
jQueryプラグインはprototype拡張のように `$.fn.greenify = function (){}` と拡張するルールでした。
21+
22+
`jQuery.fn`の実装を見てみると、実態は`jQuery.prototype`であるため実際にprototype拡張していることがわかります。
23+
24+
```
25+
// https://github.com/jquery/jquery/blob/2.1.4/src/core.js#L39
26+
jQuery.fn = jQuery.prototype = {
27+
// prototypeの実装
28+
}
29+
```
30+
31+
32+
`$()`は内部的に`new`をしてjQueryオブジェクトを返すので、このjQueryオブジェクトではprototypeに拡張したメソッドが利用できます。
33+
34+
```
35+
$(document.body); // 返り値はjQueryのインスタンス
36+
```
37+
38+
つまり、jQueryプラグインはJavaScriptのprototypeをそのまま利用しているだけに過ぎないということがわかります。
39+
40+
## どういう用途に向いている?
41+
42+
jQueryプラグインの仕組みがわかったのでどういう用途に有効な仕組みなのか考えてみましょう。
43+
44+
単純なprototype拡張であると言えるので、利点はJavaScriptのprototypeと同様と言えるかもしれません。
45+
動的にメソッドを追加するだけではなく、既存の実装を上書きするmonkey patchのようなものもプラグインとして追加することができます。
46+
47+
## どういう用途に向いていない?
48+
49+
これもJavaScriptのprototypeと同様で、prototypeによる拡張は柔軟すぎるため、
50+
jQuery自体がプラグインのコントロールをすることが難しいです。
51+
52+
また、プラグインが拡張するjQueryの実装に依存し易いため、
53+
jQueryのバージョンによって動かなくなるプラグインが発生しやすいです。
54+
55+
jQueryではそこをどうやってカバーしているかというと、
56+
ドキュメント化されてないAPIは触っていけないというルールを設けているだけとなっています。
57+
1858
## 実装してみよう
1959

2060
`calculator`という拡張可能な計算機をjQuery Pluginと同じ方法で作ってみたいと思います。
@@ -49,4 +89,20 @@ calculator.fn = calculator.prototype;
4989
[import, calculator-example.js](../../src/jQuery/calculator-example.js)
5090

5191
実装をみてもらうと分かりますが、JavaScriptの`prototype`の仕組みをそのまま利用しています。
52-
そのため、特別な実装は必要なく「拡張する時は`calculator.prototype`の代わりに`calculator.fn`を拡張して下さい」というルールがあるだけとも言えます。
92+
そのため、特別な実装は必要なく
93+
「拡張する時は`calculator.prototype`の代わりに`calculator.fn`を拡張して下さい」
94+
というルールがあるだけとも言えます。
95+
96+
## まとめ
97+
98+
ここではjQueryプラグインの仕組みや実装について学びました。
99+
100+
- jQueryプラグインは `jQuery.fn` を拡張する
101+
- `jQuery.fn``jQuery.prototype` と同じである
102+
- jQueryプラグインとは`jQuery.prototype`を拡張したものといえる
103+
- 柔軟であるが、プラグインが行うことを制御することが難しい
104+
105+
## 参考資料
106+
107+
[Plugins | jQuery Learning Center](https://learn.jquery.com/plugins/ "Plugins | jQuery Learning Center")
108+
- [jQuery拡張の仕組み 〜 JSおくのほそ道 #013 - Qiita](http://qiita.com/hosomichi/items/29b19ed3ebd0df9361ae)

0 commit comments

Comments
 (0)