2016-12-28 11 views
3

私はJavaScriptを使ってOOPをより深く学びたいと思っています.JavaScriptでクラスやオブジェクトを作成するさまざまな方法があります。私が正しく理解していれば、2つの最も一般的な方法は以下の通りです。しかし、私はそれらの間で何が違うのか理解していません。メソッドは正確に同じ結果を与えています。それらが同一である場合、なぜ2つの異なる方法があるのですか?JavaScriptオブジェクトの作成方法の違いは何ですか?

V1

function Country(name){ 
    this.name=name; 
    this.cities=[]; 
    this.continent; 
} 

Country.prototype={ 
    constructor:Country, 
    addCity:function(name){ 
     this.cities.push(name) 
    }, 
    setContinent:function(continent){ 
     this.continent=continent; 
    } 
} 

V2

function Country(name){ 
    this.name=name; 
    this.cities=[]; 
    this.continent; 

    this.addCity=function(name){ 
     this.cities.push(name); 
    } 

    this.setContinent=function(continent){ 
     this.continent=continent; 
    } 
} 

あなたの四大答えをありがとうございました。私はその違いを正しく理解しました。おそらくあなたが知っているように、EcmaScript6のようにJavaのようなクラスとオブジェクトを作成することは可能でした。

添加

次に、このシステムは、メソッドのプロトタイプと同じであり、使用するには全く欠点がありません。

class Country 
{ 

    constructor(name){ 
     this.name=name; 
     this.cities=[]; 
     this.continent; 
    } 

    addCity(name){ 
     this.cities.push(name); 
    } 

    setContinent(continent){ 
     this.continent=continent; 
    } 
} 

c1 = new Country() 
c2 = new Country() 
console.log(c1.addCity == c2.addCity) // gives true 

私が試した@ vothaisonの方法と私は、これはプロトタイプの方法と同じであると思い言ったように。

+0

MDNは、最初のアプローチを使用しています。https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/create – ppasler

+0

@charty ES6クラスはV2のように見えますが、内部的にはV1に似ています。 – vothaison

+1

私は答えを更新する必要はないと思う。これは優れた説明です:https://reinteractive.com/posts/235-es6-classes-and-javascript-prototypes;チェックアウトしてください。 – vothaison

答えて

5

あなたの2つの方法は同じではありません。また、V1は方法です。

V1では、作成された国のすべての新しいインスタンスは、addCityメソッドとsetContinentメソッドの同じインスタンスを使用します。

V2では、すべてのインスタンスがaddCityメソッドとsetContinentメソッドという独自のインスタンスを持っていますが、これはリソースの無駄です。

あなたは、このコードでそれらをテストします。

c1 = new Country() 
c2 = new Country() 
c1.addCity == c2.addCity // true in V1, false in V2 
+0

私の質問が更新されました。どうぞご覧ください。 – amone

1

V1は行くことをお勧めの方法です。

それはPrototype Pattern

Prototypeパターンが新しいオブジェクトを作成し使用し、むしろ非初期化オブジェクトを作成するよりも、それは、プロトタイプからコピーされた値で初期化されているオブジェクトを返す - 又はサンプル - オブジェクト。 Prototypeパターンは、Propertiesパターンとも呼ばれます。

MDNは非常によく長所と短所を説明しますInheritance and the prototype chain

関連する問題