15

emberjs.com http://emberjs.com/documentation/#toc_reopening-classes-and-instancesのドキュメントを読んでいるときに混乱しました

上記のページでは、このように説明しています。

Person.reopen({
    // override `say` to add an ! at the end
    say: function(thing) {
    this._super(thing + "!");
    }
});

ご覧のとおり、プロパティとメソッドをインスタンスに追加するには、open を使用します。ただし、クラス メソッドを作成するか、クラス自体にプロパティを追加する必要がある場合は、reopenClass を使用できます。

Person.reopenClass({
    createMan: function() {
    return Person.create({isMan: true})
    }
});

Person.createMan().get('isMan') // true

説明には「reopenはプロパティとメソッドをインスタンスに追加するために使用されます。」とありますが、上記の例はどちらも、クラスメソッドを作成する方法、またはインスタンスではなくクラス自体にプロパティを追加する方法について話していると思います。

私はそれが言っていることを誤解していますか?私は経験豊富なプログラマーではないので、誤解されているかもしれません...

私が誤解している場合は、いつopenとopenClassを使用するかを説明してください。

前もって感謝します!

4

2 に答える 2

16

ドキュメントはこれをうまく説明していません、非常に難しいテーマです。

ところで、現在は 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 (インスタンス) に関連しているように聞こえるからです。うまくいけば、それで少し問題が解決します:)

于 2014-05-02T05:29:36.380 に答える
1

reopen()とreopenClass()を試した後、それらの違いを理解しました。

これが私の実験の結果です。

var Person = Ember.Object.extend({

    name:"",
    alive:true,
    sayHi:function(){
        alert("hi");
    }

});

Person.reopenClass({
    age:30,

    sayHo:function(){
    alert("ho");
}   

});

Person.reopen({
height:180,
sayYo:function(){
    alert("yo");
}
})

var person = Person.create({
    name:"Tom"
});


//person.reopenClass();//error!!

person.reopen({
    sayWhat:function(){
        alert("what!?");
    },

    weight:100

});

console.log(Person.alive);//undefined
console.log(Person.age);//30
console.log(Person.height);//undefined
console.log(Person.weight);//undefined

console.log(person.alive);//true
console.log(person.name);//Tom
console.log(person.height);//180
console.log(person.weight);//100

person.sayHi();//it works

//person.sayHo();//it doesn't work
Person.sayHo();//it works

person.sayYo();//it works
//Person.sayYo();//it doesn't work

//Person.sayWhat();//it doesn't work
person.sayWhat();
于 2012-12-25T02:13:02.053 に答える