質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

6回答

189閲覧

JavaScript ライブラリについて

SHIVA

総合スコア43

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

2グッド

3クリップ

投稿2019/05/30 22:06

編集2019/05/30 22:09

学習目的で、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のプロトタイプを学習すればよろしいでしょうか?
この部分は、自分なりに調べてプロトタイプあたりかなと思って書きました。間違っていたらすみません

miyabi_pudding, yasutomi👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

yasutomi

総合スコア2937

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SHIVA

2019/05/31 07:03

ご回答ありがとうございます。IE対応が必要で、コードがわかりやすかったので ベストとさせてもらいました。 1つだけわからないことがあります。Array.prototype.slice.callの部分なのですが、 なぜ配列形式じゃないと駄目なのでしょうか?NodeListだとDOMなどの動的なものに対応できないからでしょうか?よろしくお願いいたします
guest

0

Internet Explorer: 9+

Browser Support | jQuery

とあるように、恐ろしいことにjQueryはIE9に対応しています。(1.12以下ならIE6にも対応しています)
なので、レガシーブラウザ対応の勉強をするつもりではないなら、そのコードを参考にしないほうがいいでしょう。

よそ様のコメント欄にも書きましたが、個人的にはprototypeはレガシーだと思っていますので、class構文を学んだ方がいいと思います。

投稿2019/05/31 01:36

Lhankor_Mhy

総合スコア36134

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

今知るべきはクラスの概念だと思います。

jQueryでその書き方ができるのは、jQueryが必ずjQueryのオブジェクトを返すからです。
望んでいる書き方で、sizeが所属しているクラスがjQueryクラスにあたります。

jQueryっぽい書き方を再現しようとすると、わずかに一つ、sizeを再現するためだけでも、クラスから構築する必要があります

投稿2019/05/30 22:44

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miyabi_takatsuk

2019/05/31 00:43

横槍失礼します。 JavaScriptはプロトベースなので、あくまでJavaScriptでやるなら、まっすぐプロトタイプでいいかなとは思いますけどね・・・。(クラスベースとは、随分仕様ややり方が違ってくる) 概念的には、確かにクラスの考え方も必要かと思いますが、そこは概念でいうならオブジェクト指向の概念と言った方がいいような気もします。もちろん、クラスベースな書き方はES6以降の今ならできますが。 細かい部分失礼しました。
Lhankor_Mhy

2019/05/31 01:13

横槍の横槍失礼します。 ブラウザのES6対応がおおむね済んでいる現状では、class構文ではなくprototypeを直接操作するのはレガシーだと、個人的には思います。
miyabi_takatsuk

2019/05/31 01:22

Lhankor_Mhyさん>確かに・・・。その通りですね。 かくいう私自身が、業務では、IEのサポート必須で、ES6対応がなかなか進められない状況ですが(ポリフィルも導入困難)、 個人的なものに関しては、class構文始めES6以降での構築をしてます。 papinianusさん、大変失礼しました。
Lhankor_Mhy

2019/05/31 01:24

> IEのサポート必須 ああ、それは…… お疲れ様です。
miyabi_takatsuk

2019/05/31 01:28

Lhankor_Mhyさん> こう言っちゃうと言い訳なんですが、IEのサポート(ユーザーが3割以上いて無視できない)のおかげで、技術にめちゃくちゃ遅れを感じています 泣 なので、個人的にでも、勉強してガリガリやらんとって思ってやってます。
papinianus

2019/05/31 03:53

色々な意見があること(それが業務バックグラウンドをもって語られること)は少ないここの利点だと思うのでぜひともご指摘ください できれば、参考にすべきでないと思われた場合はマイナスしてください(初心者のかたも見るサイトなのではっきり順位を下げていただきたいと考えます)。もちろん検討した結果マイナスを取り消していただければなお嬉しいですが。
miyabi_takatsuk

2019/05/31 04:28

papinianusさん> いえ、見返し、再考して、このご回答で正しいと思いました。 拝見当初からクラスとインスタンスの概念で、JSの構文も含め、そうだとは思っていました。 どうにも私自身、言葉遊びに走ってしまっていたようです。 大変失礼しました。
guest

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
yambejp

総合スコア114896

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

何を目的としているのかが少々分かりにくいですが、まずは勝手な事をやってないでソースを読むべきです。

まぁ、少し複雑で分からない、というのなら
jQueryプラグインを自作するには?」とかのキーワードで検索してみるといいのではないでしょうか?

JavaScriptの綺麗な書き方、とかそういうのを考えているのなら、古いですがprototype.jsを読む、というのが個人的にはいいかと思います。
今のJavaScript全般を学ぶのには時代遅れのようですが。

投稿2019/05/31 01:10

yoorwm

総合スコア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
miyabi_takatsuk

総合スコア9528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SHIVA

2019/05/31 06:20

コードありがとうございます。 私の業務では、IE対応が必要なのでプロトタイプにベストさせてもらいました。すみません。 しかし、class構文を調べたところ、プロトタイプより全然(記述が)簡単にできるのに感心しました。 プロトタイプを学んだあとすぐにクラスでも同じことをしてみようと思います。
miyabi_takatsuk

2019/06/04 07:44

うぁ、IE対応ですか・・・。 非常に痛み入ります。 私の会社でも、IEサポート、まだまだ抜けれない状況なので、その辛さはよくわかります・・・。 ポリフィルとか使えばIEでもいけますが、導入困難な場合がありますので、致し方ないかと思います。 そうですね、業務で使えない状況なら、自分で勉強するしかないですよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問