《javascript权威指南》第9章 例9-8源码

 1 //创建一个新的枚举类型
 2 //不能使用它来创建该类型的新实例
 3 function Enumeration(nameToValues){
 4     var Enumeration = function(){throw "Can't Instantiate Enumerations";};
 5 
 6     var proto = Enumeration.prototype = {
 7         constructor: Enumeration,
 8         toString: function(){return this.name;},
 9         valueOf: function(){return this.value;},
10         toJSON: function(){return this.name;}
11     };
12 
13     Enumeration.values = [];
14 
15     for(name in nameToValues){
16         var e = Object.create(proto);
17         e.name = name;
18         e.value = nameToValues[name];
19         Enumeration[name] = e;
20         Enumeration.values.push(e);
21     }
22 
23     Enumeration.foreach = function(f, c){
24         for(var i = 0; i < this.values.length; i++) f.call(c, this.values[i]);
25     };
26 
27     return Enumeration;
28 }
29 
30 function Card(suit, rank){
31     this.suit = suit;
32     this.rank = rank;
33 }
34 
35 Card.Suit = Enumeration({Clubs:1, Diamonds:2, Hearts:3, Spades: 4});
36 Card.Rank = Enumeration({Two:2,Three:3,Four:4,Five:5,Six:6,
37                          Seven:7,Eight:8,Nine:9,Ten:10,
38                          Jack:11,Queen:12,King:13,Ace:14});
39 
40 Card.prototype.toString = function(){
41         return this.rank.toString() + " of " + this.suit.toString();
42 };
43 
44 Card.prototype.compareTo = function(that){
45         if(this.rank < that.rank) return -1;
46         if(this.rank > that.rank) return 1;
47         return 0;
48 };
49 
50 Card.orderBySuit = function(a, b){
51     if(a.suit < b.suit) return -1;
52     if(a.suit > b.suit) return 1;
53     if(a.rank < b.rank) return -1;
54     if(a.rank > b.rank) return 1;
55     return 0;
56 }
57 
58 function Deck(){
59     var cards = this.cards = [];
60     Card.Suit.foreach(function(s){
61                         Card.Rank.foreach(function(r){
62                                              cards.push(new Card(s, r));
63                                          });
64                      });
65 }
66 
67 Deck.prototype.shuffle = function(){
68     var deck = this.cards, len = deck.length;
69     for(var i = len - 1; i > 0; i--){
70         var r = Math.floor(Math.random() * (i + 1)),
71             temp;
72         temp = deck[i], deck[i] = deck[r], deck[r] = temp;
73     }
74 
75     return this;
76 }
77 
78 Deck.prototype.deal = function(n){
79     if(this.cards.length < n) throw "Out of cards";
80     return this.cards.splice(this.cards.length - n, n);
81 }
82 
83 var deck = (new Deck()).shuffle();
84 var hand = deck.deal(13).sort(Card.orderBySuit);
85 
86 console.log(hand);

 

posted @ 2016-01-11 15:42  Dream Catcher  阅读(347)  评论(0编辑  收藏  举报