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

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

新規登録して質問してみよう
ただいま回答率
85.47%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

JavaScript

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

Q&A

解決済

5回答

1868閲覧

「〇〇オブジェクトは△△オブジェクトの□□プロパティで取得できる」の意味

susumu-99

総合スコア44

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

JavaScript

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

0グッド

1クリップ

投稿2021/09/01 22:58

編集2021/09/02 01:08

お世話になります。
JavaScript学習中のものです。

ある参考書(SHOEISHA「HTML5 レベル2 ver2.0対応 スピードマスター問題集 初版」P199)に以下の文面があります。
「FileListオブジェクトはinputオブジェクトのfilesプロパティで取得できる」
この意味するところについてご教授をお願いします。

このことを自分で考えると、
オブジェクトとは、例えば
var person = {name: 'Tom'};
であればpersonオブジェクトと呼ばれるものになり、"name: 'Tom'"の部分がプロパティということは分かっています。
このことを踏まえると「FileListオブジェクトはinputオブジェクトのfilesプロパティで取得できる」とは、
JavaScriptにはもともと
var FileList = {(key): (value);…};というのがあって、
var input = {files: (value);…} というものもあるのだと思いますが、
このFileListオブジェクトとinputオブジェクトの関係がよく分かりません。

「継承」という概念であれば少し分かるのですが、それとも違うような気がしています。

どなたか分かる方いらっしゃればよろしくお願いします。

【追記】

SHOEISHA「HTML5 レベル2 ver2.0対応 スピードマスター問題集 初版」P199の抜粋

HTML
<input type="file" id="files" multiple>

JavaScript
var showFilesNames = function(){
var inputFiles = document.querySelector("#files");
var files = inputFiles.files;
for(var i = 0; i < files.length; i++){…}
(以下省略)…
上記のlengthが空白で、埋めるものを選択するという問題です。

この解説に、「FileListオブジェクトはinputオブジェクトのfilesプロパティで取得できる」という部分があったため、あるオブジェクトが別のオブジェクトのプロパティで取得できるとは、どういう意味なのかわからなかったため質問させていただきました。
ちなみに’length’はFileListオブジェクトのプロパティとなっています。

よろしくお願いします。

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

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

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

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

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

m.ts10806

2021/09/01 23:02

>ある参考書 書籍名と版数を明示してください。
susumu-99

2021/09/01 23:07

SHOEISHA「HTML5 レベル2 ver2.0対応 スピードマスター問題集 初版」になります。
m.ts10806

2021/09/01 23:13 編集

質問は編集できますので、質問本文に追記願います。 あと、たまたま手元に持ってました。私も確認してみます(可能ならページ数、設問番号なども欲しい)
susumu-99

2021/09/01 23:21

追加しました。設問は5-13になります。
退会済みユーザー

退会済みユーザー

2021/09/02 01:34

質問の【追記】に対してレスしましたので見てください。それに対するフィードバックを書いてください。
退会済みユーザー

退会済みユーザー

2021/09/04 05:41

質問者さん、その後無言ですが、問題・疑問が解決したのであればベストアンサーを選んでこのスレッドはクローズしてください。まだ質問があるならそれを書いてください。とにかく無言で放置は NG です。
susumu-99

2021/09/04 07:15

質問に対する解決はできたのに放置してしまいすいません。 今回私の質問のしかたも悪かったのですが、1番聞きたかった点に回答をくださったthink49さんの回答をベストアンサーに選ばせていただきました。 回答をくださったみなさまに感謝です。ありがとうございました。
guest

回答5

0

ベストアンサー

HTMLInputElement.prototype.files

HTMLInputElement.prototype.files を参照すれば、「FileList.prototype[[Prototype]] に持つオブジェクト」を返します。

HTML

1<input id="sample" type="file"> 2 3<script> 4 'use strict'; 5 const input = document.getElementById('sample'); 6 7 console.log(Object.getPrototypeOf(input) === HTMLInputElement.prototype); // true 8 console.log(Object.getPrototypeOf(input.files) === FileList.prototype); // true 9 console.dir(HTMLInputElement); 10 console.dir(FileList); 11</script>

FileList.prototype.length

FileList InterfaceのIDLは下記の通り。

[Exposed=(Window,Worker), Serializable] interface FileList { getter File? item(unsigned long index); readonly attribute unsigned long length; };

Google Chromeでも FileList.prototype.length に getter が定義されていることを確認できます。

HTML

1<input id="sample" type="file"> 2 3<script> 4 'use strict'; 5 const files = document.getElementById('sample').files; 6 const filesPrototype = Object.getPrototypeOf(files); 7 8 console.log(filesPrototype === FileList.prototype); // true 9 console.log(files.hasOwnProperty('length')); // false 10 console.log(filesPrototype.hasOwnProperty('length')); // true 11 console.log(Object.getOwnPropertyDescriptor(filesPrototype, 'length')); // {set: undefined, enumerable: true, configurable: true, get: ƒ} 12</script>

プロトタイプチェーン

前述のコードの理解が難しいようでしたら、「プロトタイプチェーン」を調べてみてください。

仕様書

JavaScriptはECMAScriptだけでなく、DOM, HTML Standard等、様々な仕様が定義されています。
それらの interface, IDLを読んでおくと、関係性を理解しやすいと思います。

Re: susumu-99 さん

投稿2021/09/02 01:04

編集2021/09/04 05:35
think49

総合スコア18166

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

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

think49

2021/09/02 03:13 編集

> FileListオブジェクトはinputオブジェクトのfilesプロパティで取得できる ここでいう「FileListオブジェクト」「inputオブジェクト」は文章化する際に多くの情報が削られていますので、参考程度にして深く考えない事をお勧めします。 文脈を読み取ったり、前後のコードを読み解かないと、解読できない文章になっています。 あえて厳密に文章で書くと、次のようになると思います。 - 「FileList.prototype を [[Prototype]] に持つオブジェクト」は「HTMLInputElement.prototype を [[Prototype]] に持つオブジェクト」の「filesプロパティ」で取得できる - 「FileList を [[Prototype]] に持つオブジェクト」は「input要素ノードを参照するオブジェクト」の「filesプロパティ」で取得できる
susumu-99

2021/09/02 01:39

丁寧な回答ありがとうございます。 今少しMDNでプロトタイプの継承の説明を読みました。 私が聞きたかったことに1番近い内容で、モヤモヤが晴れた気がします。
think49

2021/09/04 05:38

FileList.prototype.lengthの説明を親記事に追記しました。
think49

2021/09/04 05:49 編集

・オブジェクトが持つ [[Prototype]] がなにか ・プロパティの所在がどこか(直属かプロトタイプチェーン上か) を確認すれば、構造を把握できます。 filesプロパティの所在が HTMLInputElement.prototype.files である事もFileList.prototype.lengthと同様の手順で確認できると思います。
guest

0

「FileListオブジェクトはInputオブジェクトのfilesプロパティで取得できる」
この意味するところについてご教授をお願いします。

これをもっと詳しく書くと以下のようになります。
「FileListクラスのインスタンスであるオブジェクトは、Inputクラスのインスタンスであるオブジェクトのfilesプロパティで取得できる」
(javascriptにおいては厳密には正しくない説明ですが、文章の解釈としては上記の理解の仕方で問題ありません。)

FileListやInputはシステム側で用意されているものなので実際には以下コードは動きませんが、以下のような感じです。

javascript

1var object1 = new FileList(); // object1はFileListクラスのインスタンス 2var object2 = new Input(); // object2はInputクラスのインスタンス 3object2.files = object1; // Inputクラスのインスタンスのfilesプロパティに、FileListクラスのインスタンスを入れておく 4 5// このとき、object2.files と書くと、new FileList()で作成したobject1を参照できる。 6// すなわち『FileListオブジェクト(object1)は、Inputオブジェクト(object2)のfilesプロパティで取得できる』

投稿2021/09/02 01:44

ku__ra__ge

総合スコア4524

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

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

susumu-99

2021/09/02 02:33

回答ありがとうございます。 回答していただいた内容はおおむね理解できました。 たしかにそうですね! でもこれがなぜ、FileListオブジェクトのプロパティ'length'を、 files.lengthと書くことができるのでしょうか? そこの部分はプロトタイプの継承ということでいいのでしょうか
think49

2021/09/02 03:01 編集

> var object2 = new Input(); // object2はInputクラスのインスタンス この説明用コードは new HTMLInputElement が正確のように思います。 > 「FileListクラスのインスタンスであるオブジェクトは、Inputクラスのインスタンスであるオブジェクトのfilesプロパティで取得できる」 ですので、クラスベースの説明としても、「HTMLInputElementクラスのインスタンス」と書くべきと考えています。 > 「FileListオブジェクトはinputオブジェクトのfilesプロパティで取得できる」 書籍の文章ですと、FileListはクラス名を表していますが、inputはクラス名ではなく、UpperCamelCaseでもなく、命名規則に統一性がないので、解読困難な文章になっているといえます。
ku__ra__ge

2021/09/02 03:45 編集

> なぜ、FileListオブジェクトのプロパティ'length'を、files.lengthと書くことができるのでしょうか? > そこの部分はプロトタイプの継承ということでいいのでしょうか 質問の意図がいまひとつ掴みきれていませんが、new FileList()で作成されたオブジェクトがlengthプロパティを参照できる理由はプロトタイプで説明できます。(オブジェクト.lengthを参照するときオブジェクト自身がlengthを持っていなければFileList.prototype.lengthが参照される言語仕様になっているから) > inputはクラス名ではなく 確かにそこは私も気になりました。サンプルコードが`var input = document.querySelector("#files");`ならまだ話が通じたんですけどねぇ……。
susumu-99

2021/09/02 06:52

プロトタイプの継承を知らなかったもので、 書籍の解説では、'length'は’FileListオブジェクト’のプロパティとなっていたため、質問内の書籍の問題の箇所はfilelist.lengthではないかと思いましたが、そうではなくfiles.lengthとなっているため、この点が合点がいかず質問していました。 (同じ解説内に「FileListオブジェクトはinputオブジェクトのfilesプロパティで取得できる」という部分があってここが理解できないから分からないのだと思い、質問ではそのことを中心に書いています。) サンプルコードの方は間違って入力したかなと思いましたが、あっていました。正直お2方がおっしゃているclass名云々にはついていけてませんが(´;ω;`) 大変助かりました。ありがとうございました。
guest

0

こういうことです

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 var files=f.files; 4 console.log(files instanceof FileList); // FileList型オブジェクトなのでtrue 5 console.log(files instanceof NodeList); // NodeList型オブジェクトではないのでfalse 6}); 7</script> 8<input type="file" id="f">

type=fileから得られるfilesはFileList(型の)オブジェクトとして
取得(参照したり場合によっては編集・削除したり)できるということ。

投稿2021/09/02 00:09

編集2021/09/02 00:37
yambejp

総合スコア114850

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

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

susumu-99

2021/09/02 00:29

回答ありがとうございます。 私の学習が回答の内容に到達しておらず、ソースコードで少し分からない箇所もありますが、これならFileListオブジェクトのプロパティ’length’をfilesのプロパティとして使用できる気がします。
guest

0

例えば次の例 (Pet オブジェクト (種類: 猫、名前: ジェリー) は person オブジェクト (名前: トム) の pet プロパティで取得できる) を考えると良いかも。

js

1var person = { 2 name: 'Tom', 3 pet: { 4 kind: 'cat', 5 name: 'Jerry' 6 } 7};

投稿2021/09/01 23:56

hoshi-takanori

総合スコア7895

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

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

susumu-99

2021/09/02 00:40

大変分かりやすい回答ありがとうございます。 しかしながら、これだとkindの値を、 person.pet.kindで取得することはできるかもしれませんが、 person.kindでは取得できない気がします。 最初の質問が言葉足らずだったためすいません。
hoshi-takanori

2021/09/02 00:56

問題集を持ってないので記述の詳細が分かりませんが、input.length ではなく files.length のことなら、この例で言うといったん var pet = person.pet; とした上で、pet.kind を取得する感じでは。
susumu-99

2021/09/02 01:19

質問の追記に、引用した問題集をもう少し詳しく修正しました。 var pet = person.pet; にあたる箇所はないんですよね。 回答ありがとうございました。
maisumakun

2021/09/02 01:26

> var pet = person.pet; にあたる箇所はないんですよね。 var files = inputFiles.files;です。
susumu-99

2021/09/02 02:14

いつもありがとうございます。 まず、書籍の解説では、'length'は’FileListオブジェクト’のプロパティとなっています。 であれば、質問内の問題の箇所はfilelist.lengthではないかと思いましたが、そうではなく files.lengthとなっているため、この点が合点がいかず質問していました。 (同じ解説内に「FileListオブジェクトはinputオブジェクトのfilesプロパティで取得できる」という部分があってここが理解できないから分からないのだと思い、質問ではそのことを中心に書いています。) var inputFiles = document.querySelector("#files"); var files = inputFiles.files; では、これがfiles.lengthになる説明にはならないと思っています。 files.lengthになる理由は、他の方が説明していただいていましたが、プロトタイプの継承ではないかと思っています。
hoshi-takanori

2021/09/02 02:22

書籍の引用ありがとうございます。 var inputFiles = document.querySelector("#files"); は、id が files である DOM 要素 (つまり <input type="file" id="files" multiple>) を取得します。 次の var files = inputFiles.files; はその input 要素の files プロパティを取得します。 つまり、inputFiles が person に、files が pet に、files.length が pet.kind に相当します。
guest

0

「FileListオブジェクトはinputオブジェクトのfilesプロパティで取得できる」

もともと var input = {files: (value);…} というオブジェクトがあって、その value が FileList オブジェクトを指しているということだと思います。

【追記】

その「inputオブジェクト」というのは、html の <input> 要素のことだったのでしょうか?

https://developer.mozilla.org/ja/docs/Web/API/FileList

であれば、ちょっと話が違ってきますが。どのように使いたいのか、全体的な話を書いてもらった方が良さそうです。

【追記2】

質問の「追記」に対してレスします。

この解説に、「FileListオブジェクトはinputオブジェクトのfilesプロパティで取得できる」という部分があったため、あるオブジェクトが別のオブジェクトのプロパティで取得できるとは、どういう意味なのかわからなかったため質問させていただきました。

input 要素、files プロパティ、FileList オブジェクトの関係については、以下の記事の View のコードが説明になるのではと思います。

異なるフォルダのファイルをアップロード
http://surferonwww.info/BlogEngine/post/2020/07/09/uploading-multiple-files-in-different-folders.aspx

関係部分のみを抜粋すると、

html

1<input id="mutiplefileupload" type="file" 2 name="postedfiles" multiple="multiple" />

javascript

1<script type="text/javascript"> 2 //<![CDATA[ 3 4 $(function () { 5 // ブラウザの HTML5 File API サポートを確認 6 if (window.File && window.FileReader && window.FileList) { 7 8 // FormData オブジェクトを取得 9 var fd = new FormData(document.querySelector("form")); 10 11 // input type="file" 要素のオブジェクトを取得 12 var fileUpload = document.getElementById("mutiplefileupload"); 13 14 // input type="file" 要素でダイアログを開いてファイルを選択 15 // し[開く]ボタンをクリックすると、その都度 change イベン 16 // トが発生する。それにリスナ(下のコードの function )を 17 // アタッチして FormData オブジェクトを操作する 18 fileUpload.addEventListener('change', function (e) { 19 // files プロパティで FileList オブジェクトを取得 20 var filelist = fileUpload.files; 21 22 // 一回の操作で複数のファイルを選択できるので、以下 23 // のようにループを回して 24 for (let i = 0; i < filelist.length; i++) { 25 // File オブジェクトを FormData に追加していく 26 fd.append("postedfiles", filelist[i]); 27 } 28 }); 29 30 //]]> 31</script>

(1) input type="file" 要素がブラウザにロードされるとそのオブジェクトが生成されるので getElementById でそれを取得。

(2) ブラウザに表示された input type="file" 要素でダイアログ(紹介した記事の 2 つ目の画像参照)を開いてファイルを選択。multiple="multiple" 属性が設定してあるので複数のファイルを選択可能。

(3) files プロパティで FileList オブジェクトを取得。

(4) FileList.length プロパティで上記 (2) で選択したファイルの数を取得できる。

(5) なので、上記のコードのように for ループで選択したファイル(File オブジェクト)を一つずつ取得して操作できる。

投稿2021/09/01 23:13

編集2021/09/02 01:50
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

susumu-99

2021/09/01 23:41

回答ありがとうございます。なるほど、そういう意味であれば分かるかも! var input = {files: var FileList = {(key): (value);…};…}ということでしょうか。 しかしながら、この参考書の続きでは、FileListオブジェクトのプロパティ’length’が、’files.length’という形で値を取得しているところがあります。これをあてはめると、 var input = {files: var FileList = {length: (value);…};…}から、 ’files.length’として値を取得していることになります。 無学で申し訳ありませんが、そういうことは可能なのでしょうか?
退会済みユーザー

退会済みユーザー

2021/09/01 23:43

【追記】を読んでいただけたでしょうか?
Zuishin

2021/09/01 23:45

FileList は変数名ではなくクラス名です。クラス名は大文字で始める約束になっています。
退会済みユーザー

退会済みユーザー

2021/09/01 23:55

> FileList は変数名ではなくクラス名です。 たぶん、HTML5 の FileList オブジェクトの話だろうと思います。
susumu-99

2021/09/01 23:59

MDNのリンクありがとうございます。 たしかに、htmlにインプット要素はあります。htmlにオブジェクトがあるんでしょうか。もしあればそうかもしれません。 問題集の問題に対する解説のため、全文は書けませんが抜粋して書きます。 HTML <input type="file" id="files" multiple> JavaScript …(省略) for(var i = 0; i < files.length; i++){…} (以下省略)… 上記のlengthが空白で埋めるものを選択するという問題です。 この解説に、「FileListオブジェクトはinputオブジェクトのfilesプロパティで取得できる」という部分があったため、あるオブジェクトが別のオブジェクトのプロパティで取得できるとはどういう意味なのかわからなかったため質問させていただきました。 ちなみに’length’はFileListオブジェクトのプロパティとなっています。 よろしくお願いします。
susumu-99

2021/09/02 00:07

いただいた回答とこちらの質問の順番が錯誤してしまい申し訳ありません。 HTML5 に FileList オブジェクトというものがあるんですか! オブジェクトはJavaScriptにしかないのかと 調べてみます。
退会済みユーザー

退会済みユーザー

2021/09/02 00:24

> 問題集の問題に対する解説のため、全文は書けませんが抜粋して書きます。 質問欄を編集して追加情報として追記願います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問