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

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

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

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

Q&A

解決済

1回答

1774閲覧

Javascriptのobjectにプロパティとメソッドをどちらも格納する

SugiuraY

総合スコア317

JavaScript

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

0グッド

0クリップ

投稿2017/01/29 06:17

いつも単純な質問で申し訳ございません。

①下記のCase1のように通常のオブジェクトにメソッドとプロパティをどちらも定義しようとしても、メソッドが反映されません。これはオブジェクトが関数オブジェクトではないからかと考えCase2のように関数オブジェクトにした場合、今度はプロパティが消えてしまいます。同じオブジェクトにプロパティとメソッドを格納するにはどうすれば良いのでしょうか?(メソッドはprototypeとして定義します)

②そもそも自作オブジェクトにメソッドとプロパティどちらも格納するという考え方が正しくないのでしょうか?

JavaScript

1<Case1> 2var obj={}; 3obj.name="Tom"; 4obj.age=45; 5obj.prototype.method =function(n){this.result=n+n}; 6 7console.log(obj);] 8//Object {name: "Tom", age: 45} 9

JavaScript

1<Case2> 2var obj=function(){}; 3obj.name="Tom"; 4obj.age=45; 5obj.prototype.method =function(n){return n+n}; 6 7var hoge = new obj; 8console.log(obj.prototype.method); 9//function (n){return n+n} 10console.log(hoge.method(2)); 11//4 12console.log(hoge.name); 13//undefined 14console.log(hoge.age); 15//undefined 16

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

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

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

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

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

guest

回答1

0

ベストアンサー

Case1は、{}にはプロトタイプがないため。
Case2は、

js

1var obj = function(){};

の時点では、単にobjに関数を設定しているだけ。

js

1var hoge = new obj; 2//した後に 3hoge.name = 'Tom'; 4hoge.age = 45;

のように、インスタンス生成した後につけるのでしたらわかりますが(インスタンスプロパティ)、
そのobjに対してプロパティをつけようとしても無理です。
関数オブジェクトとしてプロパティを設定したいのでしたら、

js

1var obj = function() {}; 2obj.prototype.name = 'Tom'; 3obj.prototype.age = 45; 4obj.prototype.method = function(n) {return n + n;} 5// または 6var obj = function() {}; 7obj.prototype = { 8 name: 'tom', 9 age: 45, 10 method: function(n) {return n + n;} 11};

としなければなりません。

投稿2017/01/29 06:39

編集2017/01/29 07:01
turbgraphics200

総合スコア4267

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

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

SugiuraY

2017/01/29 07:18

turbgraphics200様 早速、分かりやすいご回答ありがとうございます。 インスタンス化してから、インスタンスプロパティとして付け加えるか、それともすべてprototypeとして定義してしまうかですね。 ちなみに冒頭仰って頂い、 Case1は、{}にはプロトタイプがないため。 とは関数オブジェクトではないので、プロトタイプが存在しないという意味でしょうか? また、上記でご教示いただいた方法で当初の質問が実現できるとして、インスタンスやプロトタイプにメソッドにプロパティを混ぜて開発を行うことは一般的かご意見を頂戴することは可能でしょうか? 重ねてで申し訳ございませんが、よろしくお願い申し上げます。
turbgraphics200

2017/01/29 07:21

そです。 プロトタイプ(クラス)で定義するのが普通かと。
SugiuraY

2017/01/29 07:38

承知をいたしました。 非常にクリアになりました。お力添えに感謝をいたします。 よろしくお願い申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問