学習目的で、jQueryの中身を理解し、自分オリジナルのJavaScriptライブラリを作成しようと
考えています。
そこで、自分なりに(jQueryの)size()メソッドを再現してみました。
HTML
1 <div class="sample"></div> 2 <div class="sample"></div> 3 <div class="sample"></div>
JavaScript
1 var size = function(t) { 2 return t.length; 3 4 } 5 var sample = document.getElementsByTagName('div'); 6 console.log(size(sample)); // 3
ですが、なにか違うなとは薄々気づいてます。。
望んでいるのは、
JavaScript
1 size: function() { 2 return this.length; 3 } 4 $("div").size();
のような記述方法です。
ライブラリや、上記の方法で記述するには、
JavaScriptのプロトタイプを学習すればよろしいでしょうか?
スクリプトタグで毎回読み込んでいるjQuery。
よくよく考えるとなぜjQueryのメソッド使えるようになるのか理解していません。
一般的なライブラリは、どのようなJavaScriptの技術を使って構築されているのでしょうか?
よろしくお願いいたします。
追記
// JavaScriptのプロトタイプを学習すればよろしいでしょうか?
この部分は、自分なりに調べてプロトタイプあたりかなと思って書きました。間違っていたらすみません
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ベストアンサー
JavaScriptのプロトタイプを学習すればよろしいでしょうか?
はい、JavaScriptのprototypeの知識が必要です。
jQueryっぽい簡易JavaScriptライブラリを作成するための
サンプルコードを書いてみました。
SHIVAさんなら文章で説明するよりも
コードを見ていただければ直感的にご理解いただけるかと。
html
1<div class="first">foo</div> 2<div>bar</div> 3<div>baz</div> 4<script> 5var j = function(s) { 6 this.value = /^#/.test(s) ? 7 [document.getElementById(s.slice(1))] : 8 Array.prototype.slice.call(document.querySelectorAll(s)); 9 return this; 10}; 11var $ = function(selector) { 12 return new j(selector); 13}; 14j.prototype = { 15 each: function(fn) { 16 [].forEach.call(this.value, fn); 17 return this; 18 }, 19 size: function(v) { 20 return this.value.length; 21 }, 22 html: function(v) { 23 return this.each(function(i) { 24 i.innerHTML = v; 25 }); 26 } 27}; 28console.log($('div').size()); 29// => 3 30 31$('.first').html('Hello'); 32// => <div class="first">Hello</div>
投稿2019/05/30 22:55
総合スコア2937
0
今知るべきはクラスの概念だと思います。
jQueryでその書き方ができるのは、jQueryが必ずjQueryのオブジェクトを返すからです。
望んでいる書き方で、sizeが所属しているクラスがjQueryクラスにあたります。
jQueryっぽい書き方を再現しようとすると、わずかに一つ、sizeを再現するためだけでも、クラスから構築する必要があります
投稿2019/05/30 22:44
総合スコア12705
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/31 01:13
2019/05/31 01:22
2019/05/31 01:24
2019/05/31 01:28
2019/05/31 03:53
2019/05/31 04:28
0
jQueryのように$がオブジェクトを返すのであれば必ずしも
prototypeに頼る必要はありません。
(もちろん頼ってもよい)
sample
javascript
1<script> 2var $$=function(selector){ 3 var arr=[]; 4 var obj={}; 5 if(typeof selector=="object" && selector instanceof HTMLElement){ 6 arr=[selector]; 7 }else{ 8 arr=[].map.call(document.querySelectorAll(selector),function(x){return x}); 9 } 10 obj={ 11 "length":arr.length, 12 "size": function(){return this.length;}, 13 "eq": function(x){return $$(this[x]);}, 14 "text": function(x){ 15 if(x==null){ 16 return this[0]?this[0].textContent:null; 17 } 18 for(var i=0;i<this.length;i++){ 19 this[i].textContent=x; 20 } 21 return this; 22 }, 23 }; 24 arr.forEach(function(x,y){obj[y]=x}); 25 return obj; 26} 27window.addEventListener('DOMContentLoaded', function(e){ 28 console.log($$('.sample1').text()); 29 console.log($$('.sample1').eq(1).text()); 30 $$('.sample2').text('xxx'); 31 $$('.sample2').eq(2).text('yyy'); 32 console.log($$('.sample3').text()); 33 console.log($$('.sample3').eq(3).text()); 34}); 35</script> 36<div class="sample1">aaa</div> 37<div class="sample1">bbb</div> 38<div class="sample1">ccc</div> 39<div class="sample2">aaa</div> 40<div class="sample2">bbb</div> 41<div class="sample2">ccc</div>
投稿2019/05/31 03:25
編集2019/05/31 03:27総合スコア114896
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
何を目的としているのかが少々分かりにくいですが、まずは勝手な事をやってないでソースを読むべきです。
まぁ、少し複雑で分からない、というのなら
「jQueryプラグインを自作するには?」とかのキーワードで検索してみるといいのではないでしょうか?
JavaScriptの綺麗な書き方、とかそういうのを考えているのなら、古いですがprototype.jsを読む、というのが個人的にはいいかと思います。
今のJavaScript全般を学ぶのには時代遅れのようですが。
投稿2019/05/31 01:10
総合スコア1305
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
class構文を使ったうえで、
jQueryのような使用感でとするならば、下記でいかがでしょうか。
javascript
1(function(){ 2 3class libDomSingle { 4 constructor(selector){ 5 this.ELM = document.querySelectorAll(selector); 6 } 7 size(){ 8 return this.ELM.length; 9 } 10// あとはここに各種メソッド追加していく。メソッドチェーンさせる場合は、必ず、メソッドの最後で、return this;を入れる 11} 12class libInnerCollection { 13 constructor(){ 14 this.DOMLIST = {}; 15 } 16} 17const innerListInstanse = new libInnerCollection(); 18Object.defineProperty(window, '$', {value: function(selector){ 19 if (typeof innerListInstanse.DOMLIST[selector] == 'undefined') { 20 innerListInstanse.DOMLIST[selector] = new libDomSingle(selector); 21 } 22 return innerListInstanse.DOMLIST[selector]; 23}}); 24 25})();
もっとスマートな書き方あるとは思いますが・・・。
投稿2019/05/31 02:39
編集2019/05/31 02:42総合スコア9528
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/31 06:20
2019/06/04 07:44
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/05/31 07:03