2011-07-27 8 views
2

へのオブジェクト指向のアプローチを理解する助けが必要ですか?誰かがダウンして第二の方法を破るてくださいすることができは、誰かが私にはJavaScriptをオブジェクト指向のアプローチを理解するのに役立ちますJavascriptを

var Hand = function(bjcallback) { 

    this.cards = []; 

    this.onblackjack = bjcallback; 

    this.deck = [1,2,3,4,5,6,7,8,9,10,"Jack","Queen","King","Ace"]; 

    this.values = { 
     "Jack": 10, 
     "Queen": 10, 
     "King": 10, 
     "Ace": 11 
    }; 

    this.sum = function() { 
     var i, x, res = 0; 
     for (i in this.cards) { 
      x = this.cards[i]; 
      if (typeof(x) != 'number') { x = this.values[x] }; 
      res += x; 
     }; 
     return res 
    }; 

    this.pick = function() { 
     var pos = Math.floor(Math.random() * this.deck.length); 
     var card = this.deck[pos]; 
     console.log(card); 
     return card 
    }; 

    this.deal = function(n) { 
     n = n || 2; 

:私は次のように書き込みjsのコードを使用しています:

function o_deal(id) { 
    var hand = gcard1 + ", " + gcard2; 
     var res = gcard1_val + gcard2_val; 

    document.getElementById(id).innerHTML = hand; 

    if (res == 21) { 
     alert("Blackjack!"); 
    } 
if (bucket == 0) { 
    bucket = " "; 
} 

var card3_val = Math.floor(Math.random() * deck.length); 
var nhand = deck[card3_val]; 
bucket = bucket + " " + nhand + ", "; 
bucket_val = bucket_val + gcard1_val + gcard2_val + card3_val; 

if (bucket_val >= 22) { 
    var r = confirm("Bust! By " + nhand); 
    if (r == true) { 
     refresh(); 
    } 
    else { 
     refresh(); 
    } 
} 

document.getElementById(id).innerHTML = bucket; 
} 

をしかし、私はこのようなコードを記述し、スタックオーバーフロー上のポスターの数を見てきました私はその違いを理解することができますか?どんな助けもありがとう。全部がクラスであるとき指向

+0

これは単なる手続き型のオブジェクト指向です。あなたが理解していないことをより具体的にすることはできますか? – Raynos

+0

私はOO構文を全く理解していません。私はより多くを指摘しますが、私はコードに従うことができません。 OOと手続き間の文字どおりの違いは何ですか? – dopatraman

+0

2つの大きなスニペットを比較する必要があります – Raynos

答えて

2

オブジェクト指向は、ハード2ではありません。機能とデータをまとめてバンドルするだけです。

だから我々はいくつかの機能を持っています。

私はちょうど

function o_deal(id) { 
    var hand = gcard1 + ", " + gcard2, 
     res = gcard1_val + gcard2_val; 

    document.getElementById(id).innerHTML = hand; 

    if (res == 21) { 
     alert("Blackjack!"); 
    } 
} 

だが、これをリファクタリングしてみましょう。このスニペットを見てみましょう。いくつかの機能が必要です

  • isBlackjack私たちが勝ったかどうかをチェックする。

手をレンダリングするためのtoString今、私たちは手を定義する必要があります。

var Hand = { 
    "isBlackjack": function() { 
    return this.cards[0].value + this.cards[1].value === 21; 
    }, 
    "toString": function() { 
    return this.cards[0].toString() + " " + this.cards[1].toString(); 
    } 
} 

今、私たちはまだカードの概念を必要とする。もちろん、

function o_deal(id, hand) { 
    document.getElementById(id).innerHTML = hand.toString(); 

    if (hand.isBlackjack()) { 
     alert("Blackjack!"); 
    } 
} 

o_dealをリファクタリングすることができますし、我々は手を作ることができるようにする必要があります。手を作る

は簡単です。 var hand = Object.create(Hand)

我々はまた、今、私たちは今、うまくいけば、あなたはどのようにカプセル化し、データバインディングを参照することができ、手

var createHand = function() { 
    var hand = Object.create(Hand); 
    var card1 = Object.create(Card); 
    var card2 = Object.create(Card); 
    card1.value = Math.floor(Math.random() * 11); 
    card2.value = Math.floor(Math.random() * 11); 
    hand.cards = [card1, card2]; 
    return hand; 
} 

を作成する方法が必要toString方法

var CardList = [null, "1","2","3","4","5","6","7","8","9","X","A"]; 

var Card = { 
    "toString": function() { 
    return CardList[this.value]; 
    } 
} 

を必要とするカードのオブジェクトが必要です機能性を併せ持っていると便利です。

+0

私はまだOOPを完全に理解するための方法を持っていますが、これは非常に必要な光を放ちます。ありがとうRaynos。 – dopatraman

+0

@codeninjaまた、継承について何か言っている人は無視し、[traits](http://traitsjs.org/)をご覧ください。特性は、機能を再利用し、より小さなものから大きなオブジェクトを構築することを可能にします。 – Raynos

1

オブジェクトが戦場に出ます。 JavaScriptで

+0

もう少し詳しいことがありますか?どんなことがクラスにあるの? OOは、クラスに入っているとき、どのように人生を楽にしていますか? – dopatraman

2

ダグラス・クロックフォードはあなたの男です。彼は、JavaScriptの細かい点を本当に掘り下げた一連の記事を持っています。私は記事のすべてを読むことをお勧めします:

http://javascript.crockford.com/

この1には、JavaScriptのオブジェクト指向の構文を説明しています

http://javascript.crockford.com/private.html

1

オブジェクト指向のコードが組織と再利用性のためです。だから、2番目の例では、あなたはクラスHandを持っています。

var playerHand = new Hand(options); 

をし、他から片手を区別するために使用されるクラスにパラメータを渡す:だからあなたはプレーヤーのためのカードの新しい手を作成するたびに、あなたが行うことができます。

this.deck、this.cardsなどはオブジェクトのプロパティで、this.sum、this.pickなどはメソッドです。これらのメソッド(または単に関数)は、オブジェクトのパブリックプロパティとプライベートプロパティを処理できます。

OOコードのこの特定の例は、現実世界の例ではありません(少なくとも、私はそうした方法で構成しません)。 "deal"メソッドは、CardDealerクラスの一部です。

あなたは新しいインスタンスを作成することができ、そこから、(とりわけ)以下のクラス/オブジェクトを持つことになりそう:

ディーラー、プレーヤー、手、カード、ゲーム

(断っておくが、これは単にです1つのアプローチは、言及したように、これについて多くの方法があります) Gameオブジェクトには「タイプ」プロパティがあります。この場合、ブラックジャックになります。 Gameオブジェクトはブラックジャックのための適切なルールをロードする責任があります。ディーラーのインスタンスが1つ必要になり、プレーヤーのX量も同様になり、それぞれにHandオブジェクトが関連付けられます。

このように、各オブジェクトは、それぞれのプロパティとアクション(メソッド)を担当します。それはすべてを整理してカプセル化しています。

私が書いているように、@ Raynosは手続き型コードをOOとして書き直した例を掲載しましたので、うまくいけば、この方法ではなく、うわべに役立つかもしれません。

+0

これは、Raynosの故障の補完に非常に必要なものでした。どうもありがとうございました。 – dopatraman

関連する問題