【js学习笔记-053】js中的面向对象技术------枚举类型
2013-10-09 23:09
573 查看
定义一个函数enumeration()。它不是构造函数,它并没有定义一个叫enumeration的类,相反,它是一个工厂方法,每次调用它都会创建并返回一个新类
如:创建新的Coin类 Coin.Penny,Coin.Nickel等
var Coin = enumration({Penny:1,Nickel:5,Dime:10,Quarter:25});
var c = Coin.Dime;
c instanceof Coin ; //true instanceof 正常工作
c.constructor == Coin //true 构造函数的属性正学工作
Coin.Quarter+3*Coin.Nickel; //40 将值转换为数字
Coin.Dime==10 //true:转换为数字的例子
Coin.Dime >Coin.Nickel //true: 关系运算符正常工作
String(Coin.Dime)+":"+Coin.Dime//"Dime:10" 强制转换为字符串
下面来看一下具体的实现方式
//创建一个新的枚举类型,实参对象表示类的每个实例的名称和值
//返回值是一个构造函数,它标识这个新类
//注意这个构造函数也会抛出异常:不能使用它来创建该类的新实例
//返回的构造函数包含名/值对的映射表
//包含由值组成的数组,以及一个foreach()迭代器函数
function enumeration(namesToValues){
var enumeration = function(){throw "Can't Instantiate Enumerations";};
var proto = enumeration.prototype = {
constructor:enumeration,
toString:function(){return this.name;},
valueOf:function(){return this.value;},
toJSON:function(){return this.name}
}
enumeration.values= []; //用于存放可枚举对象的数组
for(var name in nameToValues){
var e = inherit(proto);
e.name = name;
e.value = nameToValues[name];
enumeration[name] = e;
enumeration.values.push(e);
}
//一个类方法,用来对类的实例进行迭代
enumeration.foreach = function(f,c){
for(var i=0;i<this.values.length;i++){
f.call(c,this.values[i]);
}
};
return enumeration;
}
下面使用枚举类型定义一副扑克牌
定义一个表示“玩牌”的类
function Card(suit,rank){
this.suit = suit;
this.rank = rank;
}
//使用枚举类型定义花色和点数
Card.Suit = enumeration({Clubs:1,Diamonds:2,Hearts:3,Spades:4});
Card.Rand = enumeration({Two:2,Three:3,Four:4,Five:5,Six:6,Seven:7,Eight:8,Nine:9,Ten:10,Jack:11,Queen:12,King:13,Ace:14});
Card.prototype.toString = function(){
return this.rank.toString() + "of" +this.suit.toString();
}
//比较扑克牌中两张牌的大小
Card.prototype.compareTo = function(that){
if(this.rank<that.rank) return -1;
if(this.rank>that.rank)return 1;
return 0;
}
//以扑克牌的玩法规则对牌进行排序的函数
Card.orderByRank = function(a,b){returna.compareTo(b));
//以桥牌的玩法规则对扑克牌进行排序的函数
Card.orderBySuit = function(a,b){
if(a.suit<b.suit) return -1;
if(a.suit>b.suit)return 1;
if(a.rank<b.rank)return -1;
if(a.rank>b.rank)return 1;
return 0;
};
//定义用以表示一副标准扑克牌的类
function Deck(){
var cards = this.cards = [];
Card.Suit.foreach(function(s){
Card.Rank.foreach(function(r){
cards.push(new Card(s,r);
});
});
}
//洗牌的方法,重新洗牌并返回好的牌
Deck.prototype.shuffle = function(){
//遍历数组中的每个元素,随机找出牌面最小的元素,并与当前遍历元素交换
var deck = this.cards,len = deck.length;
for(var i=len-1;i>0;i--){
var r = Math.floor(Math.random()*(i+1)),temp;
temp = deck[i],deck[i] = deck[r];,deck[r] = temp;
}
return this;
}
//发牌方法:返回牌的数组
Deck.prototype.deal = function(n){
if(this.cards.length<n) throw "Out of cards";
return this.cards.splice(this.cards.length-n,n);
};
//创建一副新扑克牌,洗牌并发牌
var deck = (new Deck()).shuffle();
var hand =deck.deal(13).sort(Card.orderBySuit);
相关文章推荐
- 学习笔记---枚举类型、联合体、自定义类型
- 【js学习笔记-006】--类型/值/变量.概述
- js学习笔记:引用类型——Date
- 数据类型回顾——数据类型转换(显式和隐式)—JS学习笔记2015-6-3(第47天)
- C++学习笔记之七 复合类型---枚举
- C++ 学习笔记(19)new/delete表达式、定位new、typeid、dynamic_cast、type_info、枚举类型、成员函数指针、union、位域、volatile限定符、链接指示
- 【js学习笔记-034】--枚举属性
- JS学习笔记-数据类型
- 引用类型1——JS学习笔记2015-6-23(第64天)
- 引用类型2 Array——JS学习笔记2015-6-24(第65天)
- 学习笔记→JS时间类型ToString()
- js学习笔记14----DOM概念及子节点类型
- JS 引用类型 Math 对象 JS学习笔记2015-7-3(第74天)
- 黑马程序员----C 语言学习笔记之枚举类型和typedef关键字
- Dynamic CRM 2013学习笔记(十七)JS读写各种类型字段方法及技巧
- js学习笔记:数据类型
- [知了堂学习笔记]_JS的数据类型
- 【JS学习笔记】JS基础上:数据类型
- C#基础学习笔记--数据类型,值类型,结构类型,枚举类型
- JavaScript高级程序设计(第3版)学习笔记3 js简单数据类型