2017-05-03 6 views
0

最近私はJavascriptの学習を開始し、いくつかの重要な概念について私の頭を覆そうとしています。これまでの私の理解によれば、Javascriptにはクラスがなく、クラスの代わりにコンストラクタ関数を使用してオブジェクトの青写真を作成します。例:私たちは、そのクラスのオブジェクトのための青写真を作成するクラスを持っているので、JavaScriptのコンストラクタ関数とTypescriptクラス

// javascript code 
var Car = function() { 
    // this is a private variable 
    var speed = 10; 

    // these are public methods 
    this.accelerate = function(change) { 
    speed += change; 
    }; 

    this.decelerate = function() { 
    speed -= 5; 
    }; 

    this.getSpeed = function() { 
    return speed; 
    }; 
};  
// typescript code 
class Car { 

    public speed: number = 10; 

    public acceleration(accelerationNumber: number): void { 
    this.speed += accelerationNumber; 
    } 

    public decelerate(decelerateNumber: number): void { 
    this.speed += decelerateNumber; 
    } 

    public getSpeed(): number { 
    return this.speed; 
    } 
} 

上記の活字体コードは、はるかに理にかなっています。しかし、Javascriptでは、この青写真は関数で作成されています。したがって、Javascriptでのコンストラクタ関数の意味は、クラスがTypescript/Java/etcで行うことと同じことです。

+1

これらの2つは完全に同等ではありません。 Javascriptのバージョンは 'prototype'を使ってメソッドを定義し、' speed.'を 'this.speed'に置くべきです。 – deceze

+0

はい。あなたの "クラス"はint function(){}に変換され、newというキーワードで呼び出されます。これは文法砂糖のようなものです。しかし、ES6のクラスでは、標準(砂糖としても)として来るでしょう。 https://googlechrome.github.io/samples/classes-es6/ – Vitalii

+0

「Javascriptにはクラスがありません」 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes Areあなたは文字通り言及していますか、あるいはjavascriptクラスの実装は他の言語と構造的に異なりますか? – Zze

答えて

1

その活字体クラスに正しい同等であろう:

var Car = function() { 
    this.speed = 10; 
}; 

Car.prototype.accelerate = function (change) { 
    this.speed += change; 
}; 

Car.prototype.decelerate = function() { 
    this.speed -= 5; 
}; 

Car.prototype.getSpeed = function() { 
    return this.speed; 
}; 

Car関数、コンストラクタ関数、constructor()classにあるものは基本的です。それは新しいインスタンスを初期化するために実行されるものです。 prototypeのすべての関数は、すべてのインスタンスが共有するクラス内で定義された他のメソッドです。

+0

ありがとう@deceze!しかし、コンストラクタ関数 'Car'がある場合、そのクラスはどこに定義されていますか?私の知る限りでは、クラスの新しいオブジェクトを作成するためにコンストラクタ関数が使用されるためです。この場合、クラスはどこに定義されていますか? – Aiguo

+2

そうではありません。マジックは 'new'キーワードにあります。新しいオブジェクトを構築し、コンストラクタ関数で初期化し、 'prototype'から物を継承するようにします。これは他のほとんどのOO言語で実際に起こることと大きく異なるものではなく、キーワード 'class'を使用する構文では表現されません。あなたは、ソーセージがJavascriptでどのように作られるのかについて実際にもう少し詳しく見ています。 – deceze

+2

プロトタイプオブジェクトはテンプレートとして機能します。 https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object_prototypes – Allan

関連する問題