1

Javascript では、クラスを作成する方法がいくつかあります。しかし、私はこれら2つの方法の間にいくつかの疑問があります:

function MyClass(){

    this.myFun = function(){
        // do stuff
    }
}

var MyClass = {

    myFun: function(){
        // do stuff  
    }
}

new唯一の違いは、演算子を使用できない 2 番目の方法ですか? Json 表記法を使用すると、静的クラスまたはシングルトン クラスを作成できますよね?

4

3 に答える 3

3

いくつかの小さな修正。JS では、これらは単なるクラスシミュレーションです。この言語には、実際のクラスの形式化された概念がありません。そして、あなたの JSON 表記は実際には JS オブジェクトです。これは、現在持っているように無効な JSON になります。

シングルトン パターンをシミュレートするためにオブジェクトを使用する必要はありません。次のようなコンストラクターでこれを行うことができます。

function Animal() {
    if (Animal.instance) return Animal.instance;
    Animal.instance = this;
    /* constructor code here */
}
var animal_a = new Animal(); //constructor runs
var animal_b = new Animal(); //singleton instance returns
console.log(animal_a === animal_b); //true

また、最初のアプローチでは、インスタンスごとに個別に宣言するよりも、再利用可能で継承可能なコードをプロトタイプに配置する方が良いことに注意してください。これはより高速で、より賢明です - プロトタイプはそのための場所です。

function Animal() {}
Animal.prototype.method = function() {}

これにより、独自のプロパティと継承されたプロパティを区別するという問題も回避されます。これは、各インスタンスでメソッドを個別に宣言しているため、コードでは実行できませんでした。

[編集- プライベート メンバーに関する OP の質問への回答]

プライベート メンバーはローカル変数/関数として実装されます。つまり、現在のクロージャの外ではアクセスできません。

function Animal() {
    var private_var = 'foo';
    function private_method = function() { alert('bar'); };
}

パブリック メソッドは (選択した場合) それらを取得または設定できますが、それら自体がこれらのプライベート メンバーにアクセスできるようにするには、コンストラクターの外側ではなく、コンストラクターの内側で宣言する必要があります。

function Animal() {
    var private_var = 'foo';
    function private_method = function() { alert('bar'); };
    if (!Animal.prototype.public_method)
        Animal.prototype.public_method = function() {
            alert(private_var);
        };
}
var dog = new Animal();
dog.public_method(); //'foo'
于 2012-08-18T08:24:48.453 に答える
3

あなたが示したコードはクラスを作成しません。の概念はclassJavaScript には不明であり、プロトタイプの継承を使用します。今あなたのコードについて。コードの最初の部分は、コンストラクター関数を表します。そこから、キーワード を使用して、インスタンスnew(共有プロパティを持つ JavaScript オブジェクト) を派生させることができます。

function MyConstructor(name){
  this.name = name || 'no name yet';
  this.myFun = function(){
     alert(this.name);
  }
}
var instanceA = new MyConstructor('Webman')
   ,instanceB = new MyConstructor;
instanceA.myFun(); //=> 'Webman'
instanceB.myFun(); //=> 'no name yet'

2 番目のコードは、単一の JavaScript オブジェクトを作成します。オブジェクトリテラル表記を使用します。

var mySingleObject = {
    myFun: function(){
        alert('I am single');
    }
};
mySingleObject.myFun(); //=> 'I am single'

Mozilla Developer Network には、より詳細に説明されている素敵なページがあります。

オブジェクトリテラルを使用してオブジェクトを作成すると、すべてが公開されます。コンストラクターを使用すると、javascriptsクロージャーメカニズムを使用して、プライベート変数を持つことができます。

function MyConstructor(name){
   var namestring = 'the name property of this instance is: '+ 
                     (name || 'not set'); 
   this.myFun = function(){
     alert(namestring);
   }
 }
于 2012-08-18T08:53:43.060 に答える
1

javascriptにはクラスはありません。javascriptは典型的な言語です。
これを見るよりも速く説明する方法はありません:JavaScriptのCrockford-第2章:そして、jsonの父による簡単な正しい説明のためのJavaScriptがありました(とりわけ)。

幸運を!!

于 2012-08-18T08:23:01.653 に答える