9

Javascript クラス (またはシングルトン オブジェクト) を正しく構築する方法を理解しようとしています。

var obj = new Object();
obj.foo = 'bar';
obj.method = function() { ...}

var obj = {
    foo : 'bar',
    method : function() { ...}
}

var obj = function(){}
obj.prototype = {
    foo : 'bar',
    method: function() { ... }
}

いくつかのプロパティを設定し、利用可能なメソッドを割り当てられるようにしたいと考えています。また、これらのオブジェクトをevents などで拡張できるように、オブジェクトでmixinなどを使用できるようにしたいと考えています。

4

4 に答える 4

8

Javascript クラス (またはシングルトン オブジェクト) を正しく構築する方法を理解しようとしています。

それら(「クラス」とシングルトンオブジェクト)には大きな違いがあります。最初の 2 つの例は、1 回限りのオブジェクト (シングルトン) です。3 番目 (最後) の例では、同じプロトタイプを共有する複数のオブジェクトを作成できるコンストラクター関数を作成します。あなたがやっているようにそれを置き換えるのではなく、コンストラクター関数のプロパティを拡張することをお勧めします。prototype

var Thingy = function() {   // Or use a function declaration rather than expression
    // Optional initialization code here
};
Thingy.prototype.foo = 'bar';
Thingy.prototype.method = function() {
    // Method code here
};

(コンストラクター関数は、慣例により、大文字で始まります。)

どちらを使用するか (シングルトン関数またはコンストラクター関数) は、必要なものによって異なります。

ES2015 (別名「ES6」) の時点では、非メソッド プロトタイプ プロパティ ( your foo) を定義するための新しい構文はありませんが、より単純になっています。この提案が進めば、おそらく ES2017 または ES2018 にあるでしょうが、それまでは:

class Thingy {
    constructor() {
        // Optional initialization code here
    }
    method() {
    // Method code here
    }
}
Thingy.prototype.foo = 'bar';

継承階層に入る必要がある場合、古い ES5 構文ではかなりの配管が必要です。

var Base = function() {
};
Base.prototype.method = function(arg1) {
    // ...
};

var Derived = function() {
    Base.call(this);
};
Derived.prototype = Object.create(Base.prototype);
Derived.prototype.constructor = Derived;
Derived.prototype.method = function(arg1) {
    // Using Base's `method`, if desired, is a bit ugly:
    Base.prototype.method.call(this, arg1);
};

...これが、Prototype のClassものや私自身のLineageなどのライブラリが登場するのを見た理由です。これらは ES2015 構文では時代遅れですが、これにより非常に簡単になります。

class Base {
    method(arg1) {
        // ...
    }
}
class Derived extends Base {
    method(arg1) {
        // Use's the superclass's `method`, if desired, is easy:
        super.method(arg1);
    }
}

あなたの質問のタイトルを再:

Javascript クラスを作成する正しい方法は何ですか?

JavaScript は非常に柔軟な言語であるため、JavaScript でオブジェクトの「クラス」を作成するには、同じように正しい方法がいくつかあります。標準のコンストラクター関数、「ビルダー」関数Object.create(ES5 対応環境で) があり、より直接的なプロトタイプの継承を行うことができます。JavaScript の優れた点の 1 つは、「クラス」のスタイルを選択できることです。

于 2012-05-26T21:10:59.053 に答える
1

次のようなものも使用できます。

function O(x,y) {
   this.x=x;
   this.y=y;
   this.method=function() {...}
   return this;
}

var o=new O(0,0);
于 2012-05-26T21:11:20.500 に答える
1

理論的な解決策ではなく実用的な解決策を探している場合は、フレームワークを使用することをお勧めします。

  • Backbone.jsには、ミックスインやイベント システムなど、必要なものがすべて揃っています。

いくつかのウィジェットも必要な場合は、検討してください

どちらもクリーンなアーキテクチャを提供し、ウィジェットなしで使用できますが、Backbone よりも少し学習が必要です。

これらのフレームワークが提供する継承構造は、一般的なクラスベースのもの (Java を考えてください) と非常によく似ています。これは、単にprototype他のオブジェクトの として機能する特別なオブジェクトを内部で作成し、クラスの役割を担うためです。

たとえば、 を呼び出すExt.define('MyClass', {extend: 'ParentClass', mixins: foo, ... })と、Ext はfunction" " と、指定したメソッドを保持MyClassする無名オブジェクト ( ) を作成します。MyClass.prototype

于 2012-05-27T07:36:17.667 に答える
0

ES5をサポートするブラウザーまたは環境をターゲットにしている場合は、次のように実行できます。

var Person = {
  foo: ...,
  bar: ...
};

var Mike = Object.create(Person, { baz: ... });
于 2012-05-26T21:14:42.653 に答える