ドキュメントはこれをうまく説明していませんが、非常に難しいテーマです。
ところで、現在は
http://emberjs.com/guides/object-model/reopening-classes-and-instances/にあります。
オブジェクト指向プログラミングについて話す際の問題の 1 つは、次のように説明されることが多いことです。 - オブジェクトはオブジェクトです。オブジェクトはクラスのインスタンスです。- クラスはオブジェクトです。- インスタンスはオブジェクトであり、クラスを持ちます。
この説明は誰の役にも立たず、再帰的な問題のようです (つまり、参照に終わりはありません... オブジェクトは、オブジェクトであるクラスのインスタンスです... (繰り返し))。
私は次のように推論することを好みます。
コードを書くとき、クラスやインスタンスを記述することがよくあります。クラスは一種のモノです。果物はクラスの一例です。ここでは、特定のことについて話しているのではなく、物事の「クラス」全体について話している (名前の由来)。
実際のクラスではないことに注意してください。それが「ライブ」で「コンピューターのメモリ内」にある場合にのみ、それは現実のものとなります。それまでは、クラスの説明です。通常、コードを書くときは、テキスト ファイルにテキストを書きます。これは、コンピュータがそれを解釈またはコンパイルしてマシン コードにするときに発生する、コンピュータ内の実際のコードの記述にすぎません。
クラスが実際にはそれ自体も記述であることに気付いたとき、注意が必要です。これは、潜在的に実在するオブジェクトの全範囲の説明です。
コンピュータで「リンゴ」を作成すると、それがインスタンスになります。それもオブジェです。そのクラスは Apple であり、これはコンピュータにおいても実在のオブジェクトです。Appleについて話すとき、それはアイデアです。現実には存在しませんが、コンピューターが何かを使用するには、それを現実に存在させる必要があります。したがって、「Apple」は、抽象化されているとはいえ、具体的な実在のオブジェクトです。
最後のポイントは、オブジェクトについて人々を混乱させるものだと思います。クラスは抽象化されたものですが、コンピューターがそれらについて話したり推論したりできるようにするには、クラスを現実のものにする必要があります。そこで、「クラスは抽象を意味し、インスタンスは実在を意味する」と判断します...
問題は、継承があることです...これは抽象化のレイヤーのアイデアをもたらします...したがって、果物モデルでは、目の前に特定のリンゴがあり、これも果物であり、果物も食品です. 実際には、「この食べ物、このリンゴ」、「世界のすべての食べ物」、または「あなたのお母さんのラザニア」と言わない限り、食べ物は物または物のセットとして実際には存在しません。それは抽象的な考えです...
したがって、私たちのオブジェクト指向コンピューターでは、「オブジェクトの一種である食品を定義し、次に食品の一種である果物を定義し、果物の一種であるリンゴを定義し、次の一種であるこのリンゴを定義します。アップル"。
つまり: - Object は Food のクラスであり、Food は Object のインスタンスであり、Food 自体もクラスです! - Food は Fruit のクラスであり、Fruit は Food のインスタンスであり、Fruit 自体もクラスです! - Fruit は Apple のクラスであり、Apple は Fruit のインスタンスであり、Apple 自体もクラスです。- Apple はあなたのリンゴのクラスであり、あなたのリンゴは Apple のインスタンスです (したがって、Fruit、Food、Object のインスタンスでもあります)。ただし、これはクラスではなく、単なるオブジェクトです。
あなたのリンゴについて推論するには、それはオブジェクト (小文字の o に注意してください) であり、リンゴでもあり、果物であり、食べ物でもあり、... ここにキッカーがあります.. それはオブジェクトでもあると言えます。
これで、リンゴがオブジェクト、インスタンス (Apple、Fruit、Food & Object の)、Apple、Fruit、Food、および Object であるが、クラスではないことを理解できる位置にいることを願っています。 .
したがって...インスタンスメソッドをクラスに追加すると、そのクラスでは使用できなくなりますが、そのクラスのすべてのインスタンスで使用できます。クラス メソッドを追加すると、そのクラス (およびサブクラス) で使用できるようになります。したがって、Apple にインスタンス メソッドを追加すると、apple のすべてのインスタンスがそのメソッドを実行できるようになります。ただし、リンゴだけにメソッドを追加すると、リンゴだけがそのメソッドを持ちます。私のリンゴはしません。クラス メソッドを Apple に追加すると、Apple クラスだけがそのメソッドを実行できるようになります (便利なことに、そのすべてのインスタンスを介してアクセスすることもできます)。クラスメソッドは、特定のインスタンスを変更しないもの用です。インスタンスメソッドは、特定のものを変更するためのものですインスタンス(一般的に)。同じことがプロパティ/属性にも当てはまります。Apple クラスに「Apple color」というクラス メソッドを作成することはありません。これは、特定のApple (インスタンス) に関連しているように聞こえるからです。うまくいけば、それで少し問題が解決します:)