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

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

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

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

Q&A

1回答

264閲覧

Object.definePropertyが分かりません

newyee

総合スコア213

JavaScript

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

0グッド

1クリップ

投稿2018/09/14 12:10

javascript

1 2 function Triangle(){ 3 4 var _base = 5; 5 var _height = 4; 6 7 Object.defineProperty( 8 this, 9 'base', 10 { 11 get:function(){ 12 return _base; 13 }, 14 set: function(base){ 15 16 if(typeof base === 'number' && base > 0){ 17 18 _base = base; 19 } 20 } 21 } 22 23 ); 24 25 Object.defineProperty( 26 this, 27 'height', 28 { 29 get:function(){ 30 return _height; 31 }, 32 set:function(height){ 33 if(typeof height === 'number' && height > 0){ 34 _height = height; 35 } 36 } 37 } 38 39 ); 40 41 }; 42 43 Triangle.prototype.getArea = function(){ 44 return this.base * this.height / 2; 45 }; 46 47 var t = new Triangle(); 48 49 console.log('三角形の底辺:' + t.base);//結果:5 50 console.log('三角形の高さ:' + t.height);//結果:4 51 console.log('三角形の面積;' + t.getArea());結果:10

上記のコードのObject.definePropertyに関してお聞きしたいことがあるのですが、「t.base」「t.height」を出力した際、Triangleオブジェクトの「 _base 」「_height」に設定されている値が出力されたのですが、definePrpertyは 、「var t = new Triangle();」とした時のコンスタラクタにより実行されているということなのでしょうか?また、definepropertyのsetterを使用したい場合にはどのようにすれば実行させることができるのでしょうか?

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

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

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

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

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

guest

回答1

0

definePrpertyは 、「var t = new Triangle();」とした時のコンスタラクタにより実行されているということなのでしょうか?

はい、そのとおりです。new Triangle()と書くと少し分かりづらいですが、これはTriangle関数の実行でもあります。

definepropertyのsetterを使用したい場合にはどのようにすれば実行させることができるのでしょうか?

t.base = 7;のように書けば、それがsetterの実行となります。

投稿2018/09/14 12:29

maisumakun

総合スコア145183

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

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

newyee

2018/09/14 12:47

ご回答ありがとうございます。 ご回答いただきました、「t.base = 7;のように書けば、それがsetterの実行となります」こちらの部分につきまして、お聞きしたいことがあるのですが、ご質問させて頂いたコードの「 console.log('三角形の面積;' + t.getArea());結果:10」ここの行の下に、 「  t.base = 7; var a = new Triangle(); console.log(a.base); 」 こちらのコードを追記してみましたら、「a.base」には「5」が出力されました。 setterが実行された場合は、プライベート変数のbaseに値を設定されるものだと理解しており、そうなると、a.baseを出力した場合、「7」と表示されるのではないかと思うのですが、何故「5」が出力されるのでしょうか? 長々とすみません。ご返信頂けましたら、幸いです。
maisumakun

2018/09/14 12:56 編集

ローカル変数は関数の実行ごとに別個なものが作られますので、tが参照する_baseとaが参照する_baseは別な変数です。
newyee

2018/09/14 14:21

ご返信ありがとうございます。 ということは、ローカル変数は、Triangleオブジェクト固有のものではなく、一つ一つのインスタンスに対して、プロパティのような形でインスタンス化する際にコーピーされるということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問