例えば
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/18 12:57
回答3件
0
ベストアンサー
いいえ, 違います.
JavaScriptの文法とHTMLDOMとしての作法をごっちゃにしています.
プログラムが正しく動作するには次の3つのステップを通過する必要があります.
- プログラム言語(例えばJavaScript)の文法として正しいこと
- 利用しているAPI(例えばHTMLDOM)の使い方が適切であること
- 自分意図としたとおりにプログラムが動作すること
この視点で眺めると,
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総合スコア4756
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/12 12:52
2017/12/12 13:15
2017/12/18 12:53
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
総合スコア18164
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/12 12:40
2017/12/12 13:35
2017/12/17 13:47
2017/12/17 14:12
2017/12/18 12:50
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総合スコア4958
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/10 05:00
2017/12/10 05:18
2017/12/18 12:54
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。