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

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

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

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

Q&A

解決済

3回答

3566閲覧

javascriptでいう「オブジェクト」は直接javascriptが操作できるすべてのものでしょうか?

yamagata_user

総合スコア40

JavaScript

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

0グッド

1クリップ

投稿2017/12/10 02:51

例えば

document.body.appendChild(div);

document.body.appendChild("div");

は間違った書き方でエラーになりますが、

a = createElement("div"); document.body.appendChild(a);

は正しい書き方です。

これはjavascriptのプロパティはオブジェクトしか参照できず(div)とか("div")はオブジェクトではないのでjavascriptが解釈することは不可能で、createElement("div")ならHTMLDOMでnodeと呼ばれているDOMオブジェクトなのでjavascriptが理解できるためappendChildで正常に処理されるということなのかなと思ったのですが、これって適切な解釈でしょうか。
それとなのですが、結局プロパティと呼ばれるものはすべてがjavascriptオブジェクトでしょうか。

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

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

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

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

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

Lhankor_Mhy

2017/12/18 07:56

まだ回答を求めている、とのことですが、質問に対してはすでに回答が示されているように見えます。未解決の疑問を明示してください。
yamagata_user

2017/12/18 12:57

あ、すみません。”回答を求めている”にしないと知らないうちにクローズされてコメントできなくなるのかと思って”回答を求めている”にしただけです。いただいたコメントをよく読んで一通り理解してから閉じさせていただきたいと思ったので。。
guest

回答3

0

ベストアンサー

いいえ, 違います.
JavaScriptの文法HTMLDOMとしての作法をごっちゃにしています.

プログラムが正しく動作するには次の3つのステップを通過する必要があります.

  1. プログラム言語(例えばJavaScript)の文法として正しいこと
  2. 利用しているAPI(例えばHTMLDOM)の使い方が適切であること
  3. 自分意図としたとおりにプログラムが動作すること

この視点で眺めると,

JavaScript

1document.body.appendChild(div);

JavaScript

1document.body.appendChild("div");

これらのコードはJavaScriptの文法下では正しいコードです.

ですが, HTMLDOMの使い方としては, 前者は「変数divに格納されているものがElementでなかった場合にエラーとなる」後者は「appendChildメソッドには文字列を渡すことが出来ない」という点で問題のあるコードと言えます.


これはjavascriptのプロパティはオブジェクトしか参照できず(div)とか("div")はオブジェクトではないのでjavascriptが解釈することは不可能で、createElement("div")ならHTMLDOMでnodeと呼ばれているDOMオブジェクトなのでjavascriptが理解できるためappendChildで正常に処理されるということなのかなと思ったのですが、これって適切な解釈でしょうか。

もっとシンプルに,
「全てのメソッド・ファンクション・プロパティには受け入れ可能なデータの型がある. もしおかしな型が渡されると(これ以上コードを実行できないと判断し)エラーを発生する.」
と考えて下さい. JavaScriptとして実行できている以上JavaScriptはコードの内容を理解出来ています. しかし, それを実行した際にHTMLDOMとして間違った使い方をしているのでエラーが発生しているのです.

それとなのですが、結局プロパティと呼ばれるものはすべてがjavascriptオブジェクトでしょうか。

プロパティは(オブジェクトに結びついた)変数の一種ですから, 「すべてがjavascriptオブジェクト」と言うには語弊があります. 基本的に何が入っているかは場合によりけりです.

投稿2017/12/10 04:08

編集2017/12/10 04:18
defghi1977

総合スコア4756

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

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

yamagata_user

2017/12/12 12:52

ご回答ありがとうございます。 私は最近javascriptの学習をしていて、javascriptはjavascriptオブジェクト(その一部がDOMでnodeと呼ばれているもの)しか解釈できないと統一的に考えていたのですが、これは誤りでしょうか。 例えばdivタグをjavascriptメソッドに引数として渡したいとか、innerHTMLなどのプロパティが参照できるようにしたいと思ったときにはそのままの形では不可能で、creatELEMENTプロパティなどを使ってnode化(オブジェクト化)する必要があると考えていたのですが、これは不適切でしょうか。 でも今気づきましたがそう考えるとcreateELEMENTで参照するものはオブジェクトではないということになり矛盾してしまいます。 また、プロパティはオブジェクトを参照する存在ではないかと思っていたのですが、あるプロパティがオブジェクトかどうかはどのように判断されているのでしょうか。
defghi1977

2017/12/12 13:15

JavaScriptの学習にはきちんとした参考書を用意して下さい. もしくは https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide 等の信頼のおける出典元の記事を元に学習を進めて下さい. 決してWEBブログなどの筆者の偏見が入り込みやすい海千山千のソースを鵜呑みにするのはやめて下さいね. (いろいろ理解が追いつかないかもしれませんが, 誰でも最初はそんなものです) > javascriptはjavascriptオブジェクト(その一部がDOMでnodeと呼ばれているもの)しか解釈できないと統一的に考えていたのですが、これは誤りでしょうか。 (言いたいことは判りますが)誤りです. JavaScriptが理解する”データ”にはオブジェクトの他にも「文字列」や「数値」や「真偽値」と言ったものがあるからです. (一方「DOMでnodeと呼ばれているもの」はオブジェクトの一種であり, 正解です) > あるプロパティがオブジェクトかどうかはどのように判断されているのでしょうか。 それは「仕様」によります. DOM仕様であれば, そのプロパティ定義に則った値(オブジェクトや数値・文字列)が設定されています. (DOMを使うとはこの「DOM仕様を逐一憶える」ことにほかなりません) なお, コード上で変数はプロパティの型を判断するにはtypeof演算子やinstanceof演算子を用います.
yamagata_user

2017/12/18 12:53

ありがとうございます。 今の私だといただいた回答を正確に理解することは困難ですが、だいぶ疑問点が解決したと思います。 自分でもう少し回答を読み返して考え直してみたいと思います。 このたびはありがとうございます。
guest

0

Object 型

JavaScript における「オブジェクト」とは、Object 型の事です。

Node.prototype.appendChild

JavaScript

1document.body.appendChild("div"); // TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.

上記コードが動作しない原因は「エラーメッセージ」に書かれています。

エラーメッセージ日本語訳「型エラー: 'Node'で 'appendChild'を実行できませんでした: 第一引数は 'Node' 型ではありません」

ここでいう「'Node' 型」とは ECMAScript (JavaScriptの基本仕様)で規定される「型」の分類ではなく、広義の意味での「オブジェクトの種類」を表しており、下記リンク先で説明した「ノード」を指しています。

つまり、次の原理によって第一引数「"div"」が有効な引数ではないと扱われています。

  • 第一引数「"div"」はString型であり、Object型ではありません
  • 従って、第一引数「"div"」はノードではありません

appendChild の動作原理は次の仕様で規定されています。

上記仕様によれば、appendChild の第一引数として有効なのは「DocumentFragment, DocumentType, Element, Text, ProcessingInstruction, Comment ノード のいずれか」です。
(他にも条件がありますが、説明が複雑化する為、省略しています)

document.createElement("div") は Element インターフェースを持つ(プロトタイプチェーン上に Element.prototype を持つ)オブジェクトなので、appendChild で挿入できる、という事になります。

プロパティ

それとなのですが、結局プロパティと呼ばれるものはすべてがjavascriptオブジェクトでしょうか。

いいえ。
「プロパティアクセス演算子で呼び出せるもの全て」がプロパティです。

JavaScript

1var obj = {foo: 1}; 2 3console.log(obj.foo); // 1 (プロパティ foo を呼び出している) 4console.log(typeof obj.foo); // "number" (Number 型)

ReferenceError

JavaScript

1a = createElement("div"); // ReferenceError: createElement is not defined 2document.body.appendChild(a);

は正しい書き方です。

いいえ。
上記コードは ReferenceError となる為、正しいコードではありません。
document.createElement("div") と書いて、正しいコードとなります。

Re: yamagata_user さん

投稿2017/12/10 09:20

think49

総合スコア18162

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

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

yamagata_user

2017/12/12 12:40

ご回答ありがとうございます。 プロパティアクセス演算子とは何でしょうか? 例では「console.log(obj.foo);」の中の変数objでしょうか。 また、すべてのプロパティはjavascriptオブジェクトだと思ったのですが、オブジェクトではないプロパティは存在するのでしょうか。
think49

2017/12/12 13:35

プロパティアクセス演算子とは、obj.fooのような書式のことで、下記URLで定義されています。 http://www2u.biglobe.ne.jp/~oz-07ams/2002/ecma262r3/11_Expressions.html#section-11.2.1 obj.fooを例に取るなら、オブジェクトobjがプロパティfooを持つことになるわけですが、プロパティfooの値はObject型とは限りません…ということを親記事のコードで説明しています。
yamagata_user

2017/12/17 13:47

a = createElement("div");はイコールのすぐ後にdocumentが必要でした。ご指摘ありがとうございます。 リンク先のwebサイトを拝見したのですが私がどこまで理解できたのか不明なのですがobj.fooで例えばdocument.innerHTMLの場合、プロパティinnerHTMLはdocumentオブジェクトが直接操作しているのでjavascriptオブジェクトだと思ったのですが、逆にプロパティfooがObject型ではないケースというのはどのような場合なのでしょうか。
think49

2017/12/17 14:12

document.innerHTML は定義されていませんし、innerHTML プロパティの返り値は常に String 型ですね。 > プロパティfooがObject型ではないケース 2017/12/12 22:35のコメントでも書きましたが、親記事の例がそれです。 var obj = {foo: 1}; において、プロパティ foo は Number 型であり、Object 型ではありません。
yamagata_user

2017/12/18 12:50

もう一度いただいた回答を読み返して考えてみたいと思います。 このたびは大変詳しく教えてくださり本当にありがとうございました。
guest

0

私は趣味でC++やっています。
なので、間違っている部分もありますが。


まず、用語はきちんと把握しているでしょうか?

なんか、プロパティが Javaとかでいう オブジェクトとかインスタンスに相当するものに読み取れます。

もしそういう意味で使っているなら間違いです。

JavaScriptでの プロパティは C++でいえば メンバ変数, JavaやC#だとフィールド に相当するものです。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Working_with_Objects

で、あくまで可能性ですが、

C++やJavaなどのような型が厳格な言語だと

整数の引数を一個受け取る関数のときはそれ以外のデータ( 文字列, クラスオブジェクト, 構造体オブジェクト... ) を入れるとエラーになります。

そういうものでは?

型が違うとかが原因っていう。

JavaScriptは型がない言語らしいので、完全にこれではないですが、

それに近い感じかなと。

投稿2017/12/10 03:34

編集2017/12/10 05:20
BeatStar

総合スコア4958

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

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

raccy

2017/12/10 05:00

> メソッドは含みません。 参考として貼られているリンク先に 「簡単に言えば、オブジェクトのプロパティのうち関数であるものがメソッドです。」 と書いてあるのですが。
BeatStar

2017/12/10 05:18

raccyさん。 ありがとうございます。 言われて、びっくりして再チェックしたところ, 確かに書いてありますね... JavaScriptはあまり使い慣れていないので... 編集します。
yamagata_user

2017/12/18 12:54

ありがとうございます。 C++でも類似した概念があったとは全く知りませんでした。 また時間のある時にいただいた回答を読み返させていただきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問