我正在构建一组对象来表示我的angularjs应用程序和后端API之间的数据抽象层。我正在使用coffeescript(部分原因是为了学习coffeescript,部分是因为我喜欢他们的类实现,因为我最初来自于Days of Yore的c ++和java背景)。
所以我有类似
的东西Class Animal
@_cache: {}
...东西...
Class Dog extends Animal
@_cache: {}
等等。问题(这显然是一个语法糖的事情)是我想让Dog的所有具体子类都有自己的缓存实例。我可以通过上面的方式处理它(只是覆盖属性),或者用@_cache [@ constructor.name] = {}替换该缓存,并编写缓存访问器函数而不是直接与它交互
基本上,我要表达的模式是:“Property#{name}应该是此对象上的类级别(或静态)属性,并且所有扩展类都应该拥有自己的此属性实例”,而不是手动必须在每个孩子类型上这样做。这样做有合理的模式吗?
答案 0 :(得分:2)
我有一个建议,使用实例的动态指针到它自己的类:@constructor
在此示例中,缓存在创建第一个实例时初始化,并在构造函数本身中填充。
class Animal
# is is just here to distinguish instances
id: null
constructor:(@id) ->
# @constructor aims at the current class: Animal or the relevant subclass
# init the cache if it does not exists yet
@constructor._cache = {} unless @constructor._cache?
# now populates the cache with the created instance.
@constructor._cache[@id] = @
class Dog extends Animal
# no need to override anything. But if you wish to, don't forget to call super().
# creates some instances
bart = new Animal 1
lucy = new Dog 1
rob = new Dog 2
console.log "animals:", Animal._cache
# prints: Object {1=Animal}
console.log "dogs:", Dog._cache
# prints: Object {1=Dog, 2=Dog}
请参阅此fiddle(控制台上的结果)