3

JavascriptのネイティブOOPシステムはクラスレスと言われ、クラスベースではなくオブジェクトベースだと思います。しかし、私が見るすべての例は、常に次のようなコンストラクターで始まります。

function Person(name) {
    this.name = name;
}

このようにコンストラクターを使用するだけで、クラスが使用されていることをすでに意味しているのではないでしょうか。(Personと呼ばれるクラス)


詳細:

使えれば

a.__proto__ = b;

どのJavascriptプラットフォームでも、クラスレスだと思います。しかし、それはできません。その動作が必要な場合は、を使用する必要があります

function F() { }
F.prototype = b;
a = new F();

したがって、コンストラクター使用する必要があります。したがって、コンストラクターがJavascriptのそのような基礎である場合、それはPerson、Widgetなどのコンストラクターであることが意図されており、これらはクラスです。

4

4 に答える 4

5

JavascriptのOOPは、たとえばJavaOOPとは少し異なります。Javascriptコンストラクターはクラス定義を参照しません(したがって、クラスレスです)。むしろ、コンストラクターはプロトタイプを参照します。JavascriptのOOPのベースは、他のすべてのオブジェクトが派生するObjectオブジェクト(Objectクラスではない)です。

プロトタイピングにより、継承が可能になり、既存のオブジェクトをプロパティとメソッドで拡張できるようになります。

この記事をお勧めします。

あなたの例では:

function Person(name) {
    this.name = name;
}

Mike = new Person('Mike');

Person()関数を使用すると、。Objectという新しいプロパティを使用して、オブジェクト上にプロトタイプ化された新しいオブジェクトを作成できますname。そうですね、Javascriptoopのこの種の関数はコンストラクターと呼ばれます。

于 2012-10-01T13:29:56.117 に答える
3

クラスレスは、OOPでのJavaScriptのアプローチを説明するための不正確な方法である可能性があります。

JavaScriptにはクラス定義がありません。

また、クラスとオブジェクトの対応もありません。

Personisなどのコンストラクタでインスタンス化されたオブジェクトがクラスの ものであるかどうかを確認することはできませんPerson

期待されるオブジェクトメンバーが含まれているかどうかを確認し、期待されるクラスであると結論付けることができます。

ただし、途中でオブジェクトメンバーが変更された場合、目的の/期待される結果は得られません。

TL; DR

JavaScriptは、プレーンオブジェクトを構築するためのテンプレートを定義できる方法として、コンストラクター(適切な名前のプロトタイプ)を公開します。

重要なことは、プロトタイプ呼び出しの最終結果は、特定のクラスのオブジェクトではなく、いくつかの事前定義されたメンバーを持つプレーンオブジェクトであるということです。

于 2012-10-01T13:11:47.887 に答える
1

javascriptをクラスレス環境と考えるのは良いことです。javascriptクラスを考える場合、クラスがあり、それらが厳密に適用されている場合に実行できる特定の便利なことがあると想定できるはずです。しかし、あなたが想定することができないそれらの特定の有用なこと。コンストラクターのように見えるものが存在するからといって、クラスを作成していることを示すものではありません。

たとえば、あなたがそうだとしましょうvar dude = Person('Ashton Kutcher')。さて、dude instanceOf personあなたが真実になるとき。あなたはあなたが人の特性と方法を持っていると仮定します。いくつかのコードがやって来て、と言ったらどうなるでしょうdude.personMethod = undefined。さて、それdude instanceOf personはまだ真実ですが、personMethodはもう利用できません。

javascriptはクラスを持っていると考えることができますが、それはリークの多い抽象化です。何かが何であるか、そしてそれに対して何が期待できるかを決定することになると、javascriptをプロトタイプの継承システムを持っていると考える方が良いでしょう。

詳細はこちら: http: //javascript.crockford.com/prototypal.html

于 2012-10-01T13:26:20.820 に答える
-2

オブジェクト コンストラクターを使用してクラスを作成すると、プロトタイプを作成することで、必要になるたびにオブジェクトを再定義することなく、クラスのインスタンスを多数作成することができます。

したがって、上記の例では

function Person(name)


 {
    this.name = name;
}

名前の異なる 2 人の人物を作成できます。例 :

var personA = new Person(); personA.name = "ジェームズ";

var personB = new Person(); personB.name = "トム";

alert(personA.name + personB.name);

このリンクを読むことをお勧めします http://www.javascriptkit.com/javatutors/oopjs2.shtml

于 2012-10-01T13:21:39.153 に答える