ユーザー定義オブジェクトとは?

このQ&Aのポイント
  • ユーザー定義オブジェクトは、コンストラクタを使用して作成されるオブジェクトです。
  • コンストラクタは、オブジェクトを初期化するために使用されます。
  • thisキーワードは、コンストラクタ内で定義されたプロパティにアクセスするために使用されます。
回答を見る
  • ベストアンサー

ユーザー定義オブジェクト

現在、ユーザー定義オブジェクトについて勉強しています。 以下は本からの抜粋です。 //コンストラクタを定義する。 //thisで参照するオブジェクトの初期化法に注目   function Rectangle(w,h) { this.width=w; this.height=h; } //コンストラクタを呼び出して2つの長方形オブジェクトを生成する。 //widthとheightをコンストラクタに渡して、それぞれの新しい //オブジェクトを適切な形で初期化するやり方に注目 var rect1=new Rectangle(2,4); var rect2=new Rectangle(8.5,11); ★質問★ this.width=w; this.height=h; var rect1=new Rectangle(2,4); var rect2=new Rectangle(8.5,11); この2箇所で行っている「初期化」という作業の意味がよく分かりません。 また、ユーザー定義オブジェクトの概念についていまいちイメージ がつかめていません(特にthisとnewを使用している意図など) ご教授いただきたく、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • shigatsu
  • ベストアンサー率26% (511/1924)
回答No.1

初期化の意味 ということですが、質問のコードの場合はコンストラクタの引数をメンバ変数に代入する事を初期化と呼んでいるようですね。 コンストラクタでは、メンバ変数を初期化することは良くありますので、そのことを指しているのだと思います。 またfunction~の部分は、あくまでもコンストラクタとしての代入方法を書いてあるだけで、実体は有りませんが、 var rect1=new により新たに実体が作られ、コンストラクタにより引数で指定された値がメンバ変数に代入されます。 this は明示的に現在対象となっているオブジェクトを指すものです。 newは新しいインスタンス(実体)を作るためのキーワードですね。 オブジェクト指向やクラスの考え方について書かれた本などを一度読まれる事をお勧めします。 質問はJavaScriptについてですが、C言語がお分かりならソフトバンクから出ている「C++のからくり」という本がお勧めです。

rituritu
質問者

補足

すみません。JavaScript初心者なのでもう少し質問させていただきたくよろしくお願いします。 文脈から察すると、メンバ変数とはrect1、rect2のことを指すのですよね。 function Rectangle(w,h)でwとhを定義していますが、this.width=w;、this.height=h;で再度、wとhを定義しているのは何故でしょうか?

その他の回答 (1)

  • shigatsu
  • ベストアンサー率26% (511/1924)
回答No.2

メンバ変数は height と width です。 ソース全体が見えてないので何ともいえないのですが、どこかで height と width を定義してませんか? どこかでRectangleクラスの定義があると思うんですが、そのクラスのコンストラクタとして Rectangle(w,h)という関数があるわけです。 で、 this.height=h; は代入です。hの定義では有りません。 この辺はJavaScriptに限った話ではないので、クラスに関する本を読んだり、定義とか代入に関してはプログラミング自体の基本的な文を勉強された方が良いですね。

rituritu
質問者

お礼

正月休みで出かけていましたので、返事が送れて申し訳ございません。 JavaScriptの本を再度熟読し、ユーザー定義オブジェクトについては把握することができました。 私自身、C言語などのプログラミング経験がないのですが、 C言語の本も併用して読んでいます。 「C++のからくり」についてインターネットで調べました。 購入の検討をしたいと思っております。

関連するQ&A

  • java

    javaの問題がわかりません。 問題文は以下の通りです。 幅と高さを指定するコンストラクタ内で作ったr1とr2というインスタンスの 内容をmain()メソッドで表示する。 〔クラス図〕 クラス名 Rectangle ---------- -width:int -height:int ---------- Rectangle() Rectangle(w:int, h:int) getArea():int ------------- getArea()メソッドでは面積(高さ×幅) コンストラクタRectangle()では、widthとheightに初期値0を設定 main()メソッドでは標準入力より幅と高さを整数として受け取り コンストラクタの引数にする。 よろしくおねがいします。 途中経過 class Rectangle{ private int width; private int height; public Rectangle(???){ width = 0; height = 0; } class MENSEKI{ public static void main(String args[]){ }

    • ベストアンサー
    • Java
  • 問題が解けません(インスタンスメソッド)

    こんにちは。 課題をやっているのですが、問題が解けません。 問題内容です。 以下のクラス図で示したRectangleクラスを作成し、実行結果と同じに なるようにメソッドを作成する。 クラス図 Rectangle -width:ing -height:int ----------- Rectangle() Rectangle(w:int,h:int) getArea():int ------------- 問題文 getArea()メソッドでは面積の計算をする(高さ×幅) コンストラクタRectangle()ではwidthとheightに初期値0を設定。 main()メソッドでは標準入力より幅、高さを整数として受け取り コンストラクタの引数とする。 実行結果 >10 >20 インスタンスr1の面積は200 >123 >45 インスタンスr2の面積は5535 -------------------------- 途中経過 import java.io.*; class Rectangle{ public static int sum=0; private int width; private int height; public Rectangle(){ width=0; height=0; sum++; } public void Rectangle(int w, int h){ width=w; height=h; } public void getArea(){ int num; num=width*height; System.out.println("r" + sum + "インスタンスの面積は" + num); } } class Ex54{ public static void main(String args[]){ BufferedReader input = new BufferedReader (new InputStreamReader(System.in)); String wid = input.readLine(); String hei = input.readLine(); Rectangle rectangle1 = new Rectangle(); rectangle1.Rectangle(wid, hei); } } 「現在の問題点」 UML図の通り記述できているか自信がありません。 rectangle1.Rectangle(wid, hei);というところでエラーが出てしまいます。 r1、r2を表示するときにsumを使っているのですがこのような記述でいいか自身がありません。 どなたかよろしくお願いします。

    • ベストアンサー
    • Java
  • Rectangle(Bitmap)の幅と高さ

     以下、VBの記法で書きます。Windows10,.NETのGDI+を使用しています。  今まであまり気にしていなかったのですが、今回LockBitsとUnLockBitsを使用してBitmapのpixel情報をCopyするコードを書く事になり、急に気になり出しました。  LockBitsを使用する際、Rectangle構造体で読みだすBitmapの範囲を指定します。Rectangleが指定する実際のpixelですが、   (Rectangle.Left + Rectangle.Width - 1)×(Rectangle.Top + Rectangle.Height - 1) の範囲かな?、と思いました。例えば、   Dim Rect as Rectangle = New Rectangle(1, 1, 0, 0) などとやると、Rectは空になるし、(1, 1)一点を表すRectangleなら、   Dim Rect as Rectangle = New Rectangle(1, 1, 1, 1) なので・・・。  BitmapのWidthとHeightについても同様かと思います。実際の動作には余り影響しないのですが、気になったもので・・・。

  • Javaの基礎のプログラム

    結城浩さんの本に載っていたプログラムです。 ですが、説明がわかりにくくていまいち処理がわからなかったので 質問させていただきました。 どうやら、X軸とY軸がありY軸は下に行けばいくほど数字が大きくなる。 X軸は右に行けばいくほど大きくなる。座標上にある、二つの長方形の重なりあう部分の座標を求めるプログラムのようです。(イメージとしては、下に添付してある画像のような感じになるようです。) 質問としては一つです。 プログラム中のこの部分なのですが、おそらく「長方形の座標を示している」行であると思います。 a = new Rectangle(0, 0, 20, 10); b = new Rectangle(5, 5, 20, 10); c = new Rectangle(20, 10, 20, 10); d = new Rectangle(-10, -20, 100, 200); e = new Rectangle(21, 11, 20, 10); その後の処理としては、aとb→c→d→eというようにそれぞれ比較していっているのもなんとなくわかります。 ですが、しっかり解説されていなかったので、この4つの数字がどのように座標を示しているのかよくわかりませんでした。 よろしくお願いします。 class Rectangle { final int INITIAL_WIDTH = 10; final int INITIAL_HEIGHT = 20; int width; int height; int x; int y; Rectangle() { width = INITIAL_WIDTH; height = INITIAL_HEIGHT; x = 0; y = 0; } Rectangle(int width, int height) { this.width = width; this.height = height; this.x = 0; this.y = 0; } Rectangle(int x, int y, int width, int height) { this.width = width; this.height = height; this.x = x; this.y = y; } void setLocation(int x, int y) { this.x = x; this.y = y; } void setSize(int width, int height) { this.width = width; this.height = height; } public String toString() { return "[" + x + ", " + y + ", " + width + ", " + height + "]"; } Rectangle intersect(Rectangle r) { int sx = Math.max(this.x, r.x); int sy = Math.max(this.y, r.y); int ex = Math.min(this.x + this.width, r.x + r.width); int ey = Math.min(this.y + this.height, r.y + r.height); int newwidth = ex - sx; int newheight = ey - sy; if (newwidth > 0 && newheight > 0) { return new Rectangle(sx, sy, newwidth, newheight); } else { return null; } } public static void main(String[] args) { Rectangle a, b, c, d, e; a = new Rectangle(0, 0, 20, 10); b = new Rectangle(5, 5, 20, 10); c = new Rectangle(20, 10, 20, 10); d = new Rectangle(-10, -20, 100, 200); e = new Rectangle(21, 11, 20, 10); System.out.println("a = " + a); System.out.println("b = " + b); System.out.println("c = " + c); System.out.println("d = " + d); System.out.println("e = " + e); System.out.println("a と a の重なり = " + a.intersect(a)); System.out.println("a と b の重なり = " + a.intersect(b)); System.out.println("a と c の重なり = " + a.intersect(c)); System.out.println("a と d の重なり = " + a.intersect(d)); System.out.println("a と e の重なり = " + a.intersect(e)); } }

    • ベストアンサー
    • Java
  • javascriptのObject()コンストラクタについて質問です。

    javascriptのObject()コンストラクタについて質問です。 var obj = new Object(); var obj2 = Object(); console.log(obj === obj2)//false いつも質問ばかり恐縮です。。。 どこかのサイトでこの2つは等価みたいな記事を読んだような気がするのですが、 ということはObjectコンストラクタでオブジェクトを作る際はnew演算子は要らない?? のでしょうか?? またobjとobj2の2つの違いを色々試したのですが違いがわかりません。new演算子を 付けたインスタンスと付けないインスタンス??の違いをどなたか ご教授いただけると助かります。

  • ユーザーコントロールのDrawToBitmap

    vb.net(VisualStudio2015)で作成したユーザーコントロール内の画面を「DrawToBitmap」で取得しフォーム内に表示したいのですが上手く表示できません。もしご存知の方がいましたらご教授して頂けますと助かります。宜しくお願い致します。 Private SecondScreen as New UserControl1 'ユーザーコントロール内の画面を取得 Dim mBitmap as New Bitmap(SecondScreen.Width,SecondScreen.Height) SecondScreen.DrawToBitmap(mBitmap,New Rectangle(0,0,SecondScreen.Width,SecondScreen.Height)) . . . '取得した画面をフォームに表示 Dim g as Graphics = e.Graphics g.DrawImage(mBitmap,new Rectangle(0,0,SecondScreen.Width,SecondScreen.Height)) いくつか省略箇所がありますが、上記の方法ですとユーザーコントロール内の画面が取得できなく、「SecondScreen.Visible=True」で一度表示させてから取得すると表示されます。 フォーム内にユーザーコントロールを張り付けて表示させるのではなく、一度「DrawToBitmap」で取得させてから表示させたいのです。 お手数ですが、ご教授お待ちしています。 宜しくお願い致します。

  • 初心者です。 コンパイルのエラー

    import java.awt.*; import javax.swing.*; public class R11Sample1 extends JFrame { Rect r1 = new Rect(Color.red, 100, 100, 80, 60); Rect r2 = new Rect(new Color (0.5f, 1f, 0f, 0.7f), 150, 120, 60, 90); Oval = new Oval(Color.blue, 60, 50, 10, 10); JPanel panel = new JPanel() { public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; r1.draw(g2); r2.draw(g2); } }; public R11Sample1() { setSize(400, 350); setDefaultCloseOperation(EXIT_ON_CLOSE); getContentPane().add(panel); } public static void main(String[] args) { new R11Sample1().setVisible (true); } } class Rect { Paint pat; int xpos, ypos, width, height; public Rect(Paint p, int x, int y, int w, int h) { pat = p; xpos = x; ypos = y; width = w; height = h; } public void draw(Graphics2D g) { g.setPaint(pat); g.fillRect(xpos-width/2, ypos-height/2, width, height); } } class Oval { Paint pat; int xpos, ypos, radius; public Oval(Paint p, int x, int y, int width, int height) { pat = p; xpos = x; ypos = y; width = w; height = h; } public void draw(Graphics2D g) { g.setPaint(pat); g.fillOval(xpos-width/2, ypos-height/2, width, height); } } これでコンパイルすると、 Identifierがありません といわれました。 どこを直せばいいのでしょうか。 また、全体的に間違ったところがあったら教えてください。

    • ベストアンサー
    • Java
  • javascriptを只今勉強中なのですが、オブジェクトについてこんが

    javascriptを只今勉強中なのですが、オブジェクトについてこんがらがってしまいました。 var obj = new Object(); var obj2 = {}; Object.prototype.prop1 = "hoge"; obj,obj2共にprop1にhogeがセットされるのですが、オブジェクトリテラルのobj2は Objectコンストラクタのインスタンスと解釈できるのでしょうか?? new演算子について色々とfirebugで調べていたところこの疑問が出てきました。 newなしでもインスタンスができるのでしょうか? オブジェクトを理解していないので意味不明な質問かもしれませんが どなたかアドバイスいただけると嬉しいです。

  • 雑誌のスクリプトの意味がわかりせん2

    スクリプトと解らない点を載せさせていただきました。もしよければ教えて下さい。800字を超えないためにギュウギュウで記述しましたのでかなりややこしくなっていますが、お願いいたします。 ●MCの写りこみを作成するスクリプトです。引数に3つのMCを渡しています。 CreateReflect = function (OriginalTG, DisplayTG, MaskTG) { var OriginalBMP = new flash.display.BitmapData(OriginalTG._width, OriginalTG._height, true, 0); var DisplayBMP = OriginalBMP.clone(); //OriginalBMPと全く同じオブジェクトを新しくDisplayBMPとして作成? var MaskBMP = new flash.display.BitmapData(MaskTG._width, MaskTG._height, true, 0); OriginalBMP.draw(OriginalTG); MaskBMP.draw(MaskTG); DisplayTG.attachBitmap(DisplayBMP, 1); //ここが理解できなかったとこなのですが、これは完全に透明なビットマップを割り当てているって事ではないのでしょうか? var DisplayRectangle = new flash.geom.Rectangle(0, 0, MaskTG._width, MaskTG._height); var OffSetPoint = new flash.geom.Point(0, 0); var BasePoint = new flash.geom.Point(0, 0); //マスクを適用する際のサイズとxとyの値を設定するために定義してる? DisplayBMP.copyPixels(OriginalBMP, DisplayRectangle, OffSetPoint, MaskBMP, BasePoint, true); //これはビットマップオブジェクトのDsplayBMPにOriginalBMPをアルファーをかけた上体でコピーするって事だと思うのですが、この後にDisplayBMPをattachする必要はないのでしょうか?上記の方でDisplayTG.attachBitmap(DisplayBMP, 1);を定義してるから?とここらへんで解らなくなってしまいました。 //attachBitmapをした後にattach元のビットマップを変更すると自動的にattachされたムービークリップに反映されるという事でしょうか?};

    • ベストアンサー
    • Flash
  • C#でフォームのコピーをしたい

    最近C#を始めたのですが、フォームをコピーする際に Bitmap myBmp = new Bitmap(this.Width, this.Height); this.DrawToBitmap(myBmp, new Rectangle(0, 0, this.Width, this.Height)); Clipboard.SetDataObject(myBmp, false); といった風にコピーをしていたのですが、これではフォーム全体がコピーされ、縁ができてしまいます。範囲指定してフォームコピーをする方法はないでしょうか。