[英]How can I make a property of a class case-insensitive?
在CoffeeScript中,假设我有以下内容:
class Greeter
message: ->
greeting = switch @gender
when 'male' then 'Sir'
when 'female' then 'Madame'
else 'Unknown'
"Hello #{greeting}!"
greeter = new Greeter
greeter.gender = 'Male'
alert greeter.message()
当前,此警报提醒Hello Unknown!
当我要输出Hello Sir!
。
如何使Greeter
类将@gender
实例变量小写,以便获得正确的输出? 我不想在message
方法中仅将其小写,而是在整个Class实例中将其全部小写。 这样,它也可以在其他方法中工作。
我想我缺少了一些非常基本的东西,但是似乎无法绕开它。
注意:对于那些说我把“ Male”的大小写弄错的人。 是的,我是故意这样做的。 我希望该类在使用之前在所有情况下自动小写gender
。 因此,用户可能会弄错大写字母,并且仍然可以使用。
原因是我最终希望将其推论到其他情况,而不是仅仅处理不区分大小写的问题。
有人提到了JavaScript Getters和Setters,它们相对较新,因此在所有主流浏览器中都不支持。 我来看看那些。 我对Ruby有点熟悉。
Male
不是male
。 尝试将字符串标准化为小写:
message: ->
greeting = switch @gender.toLowerCase()
when 'male' then 'Sir'
when 'female' then 'Madame'
else 'Unknown'
如有必要,您可能希望将对小写的调用封装在某些属性getter中 : https: //stackoverflow.com/a/11592890/2363712诸如此类:
class Greeter
constructor: ->
Object.defineProperty @, 'gender',
get: ->
return @_gender
set: (value) ->
@_gender = value.toLowerCase()
message: ->
greeting = switch @gender
when 'male' then 'Sir'
when 'female' then 'Madame'
else 'Unknown'
"Hello #{greeting}!"
为此,您的运行时环境必须支持Object.defineProperty
请参阅该表以快速查找受支持的浏览器。
coffee>
class Greeter
message: =>
greeting =
if /^male/i.test(@gender) then 'Sir'
else if /^female/i.test(@gender) then 'Madame'
else 'Unknown'
"Hello #{greeting}!"
greeter = new Greeter
greeter.gender = 'Male'
greeter.message()
'Hello Sir!'
coffee> greeter.gender = 'female'
'female'
coffee> greeter.message()
'Hello Madame!'
coffee> greeter.gender = 'smizmar'
'smizmar'
coffee> greeter.message()
'Hello Unknown!'
coffee>
因此,这是执行此操作的简单方法,但它不会更改存储的值。 为此,您需要使用Object.defineProperty(对此的答案) :
Function::property = (prop, desc) ->
Object.defineProperty @prototype, prop, desc
class Greeter
constructor: () ->
@property 'gender',
get: -> "#{@ciGender}"
set: (v) -> @ciGender = v.toLowerCase()
message: ->
greeting = switch @ciGender
when 'male' then 'Sir'
when 'female' then 'Madame'
else 'Unknown'
"Hello #{greeting}!"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.