javascript權威指南-js的列舉
// 來自JavaScript權威指南219頁
// 這個是一個工廠方法,每次呼叫都返回一個新的列舉類。
// 引數物件表示類的每個例項的名字和值
// 不能使用這個返回的列舉類建立新的例項。
// 列舉值繼承自返回的這個列舉類
function enumeration (namesToValues) {
var enumeration = function () {
throw "Can`t Instantiate Enumerations"
}
var proto = enumeration.prototype = {
constructor: enumeration,
toString () {
return this.name
},
valueOf () {
return this.value
},
toJSON () {
return this.name
}
}
enumeration.values = []
for (name in namesToValues) {
var e = Object.create(proto)
e.name = name
e.value = namesToValues[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
}
var Coin = enumeration({
Penny: 1,
Nickel: 5,
Dime: 10,
Quarter: 25
})
var c = Coin.Dime
// 每個值都是這個列舉類的例項
console.log(c instanceof Coin)
console.log(Coin.Dime == 10)
console.log(Number(Coin.Dime))