遠いリポジトリに便利なsvk
第五回目です。
Subversionのlogやdiff,
ただ,
そんな時にはsvk を使う手があります。
svkのmirrorサブコマンドを使うと,
% svk mirror http://svn.rubyonrails.org/rails/spinoffs/prototype //prototype
Committed revision 3764.
% svk sync //prototype
Retrieving log information from 1 to 7693
Committed revision 3765 from revision 3362.
... (ここで途中で失敗する場合は再度 svk sync)
% svk checkout //prototype prototype
...
% cd prototype/tags/rel_1-5-1-1/src
% svk log dom.js | less
という手順で利用できます。
では,
Element への拡張
1290: if (!window.Element) var Element = {};
1291:
まず,
1292: Element.extend = function(element) {
1293: var F = Prototype.BrowserFeatures;
1294: if (!element || !element.tagName || element.nodeType == 3 ||
1295: element._extended || F.SpecificElementExtensions || element == window)
1296: return element;
1297:
1298: var methods = {}, tagName = element.tagName, cache = Element.extend.cache,
1299: T = Element.Methods.ByTag;
1300:
1301: // extend methods for all tags (Safari doesn't need this)
1302: if (!F.ElementExtensions) {
1303: Object.extend(methods, Element.Methods),
1304: Object.extend(methods, Element.Methods.Simulated);
1305: }
1306:
1307: // extend methods for specific tags
1308: if (T[tagName]) Object.extend(methods, T[tagName]);
1309:
1310: for (var property in methods) {
1311: var value = methods[property];
1312: if (typeof value == 'function' && !(property in element))
1313: element[property] = cache.findOrStore(value);
1314: }
1315:
1316: element._extended = Prototype.emptyFunction;
1317: return element;
1318: };
1319:
まずはElement.
昔はElement以下の追加メソッドは,
できるだけ効率的に,
1294行目からは,
条件文 | 付け加える必要がない理由 |
---|---|
!element | そもそも引数elementが無効, |
!element. |
tagNameプロパティが無いので要素ではない |
element. |
テキストノード(3)は対象外 |
element._extended | すでにこの関数により拡張済み |
F. |
コード最後部のElement. |
element == window | windowは対象外。それ以前にtagNameのチェックで除外されているはず |
1298行目では,
1301行目からは,
グローバルなHTMLElementが定義されている場合,
Element.
あとは,
最後に,
1320: Element.extend.cache = {
1321: findOrStore: function(value) {
1322: return this[value] = this[value] || function() {
1323: return value.apply(null, [this].concat($A(arguments)));
1324: }
1325: }
1326: };
1327:
1320行目からはElement.
findOrStore()関数は,
return this[value] = this[value] || function(){...} という形は,
無名関数の中では,
- ECMA-262 第三版 - 15.
3.4. 3 Function. prototype. apply (thisArg, argArray)