在CoffeeScript中为我的单例类定义属性getter
Defining a property getter for my singleton class in CoffeeScript
这是我为在类中创建属性而定义的辅助函数:
###
# defines a property on an object/class
# modified from https://gist.github.com/746380
###
Object::public = (name, options = {}) ->
options['default'] ?= null
variable = options['default']
getter = if typeof options['get'] is 'function' then options['get'] else -> variable
setter = if typeof options['set'] is 'function' then options['set'] else (value) -> variable = value
config = {}
config['get'] = getter if options['get']
config['set'] = setter if options['set']
config['configurable'] = no
config['enumerable'] = yes
Object.defineProperty @prototype, name, config
在一个文件中,我有下面的两个类,折叠和_折叠,后者被隐藏,只有前者导出(命名空间)到全局。
###
Public exported fetcher for fold factory,
being the only way through which to create folds.
###
class Folds
_instance = undefined
# static fetch property method
@public 'Factory',
get: -> _instance ?= new _Folds
###
Encapsuled singleton factory for one-stop fold creation
###
class _Folds
constructor: ->
create: -> new Fold
当我尝试这个时,它返回false。为什么?
console.log 'Factory' of Folds
下面返回"function Folds() {}"
console.log Folds
我不能调用fold . factory .create(),因为fold。
CoffeeScript的in
用于数组(和类数组对象);of
编译成JavaScript的in
。所以你需要的是
console.log 'Factory' of Folds
这不是核心问题,虽然:核心问题是,你正在使用的public
方法实际上定义了一个属性与给定的名称上的类原型,作为行
Object.defineProperty @prototype, name, config
告诉我们。所以你真正需要的是
console.log 'Factory' of Folds.prototype # should be true
这意味着Factory
方法将作为每个Folds
实例的属性可用。
相关文章:
- 如何在选项卡上定义属性'的主窗口对象
- 设置自动分隔符的自定义属性
- 与ng attr myCustomAttribute匹配的自定义属性指令
- 获取自定义属性的值
- 为Google闭包类定义属性的首选方式是什么
- 如何创建自定义属性以添加if.bind
- 动态更新Angular2指令中自定义属性的值
- 使用jQuery更改输入字段的自定义属性
- 在 Javascript 生成的列表中,如何将自定义属性添加到 标记
- 设置 HTML 自定义属性与在 ID 属性中存储信息
- 为什么在原型中定义属性被视为反模式
- 将对象作为参数传递后的未定义属性
- 是否可以在 Polymer 中的
节点上使用自定义属性以获得漂亮的 API - 为什么克隆节点排除自定义属性
- 将自定义属性添加到 vuejs 组件
- 使用原型对象向javascript对象添加自定义属性和方法的建议
- 正在设置自定义属性名称
- datalist获取选定的值和自定义属性(无事件)
- 在Javascript构造函数中定义属性的正确方式
- 如何使用javascript获取元素的自定义属性值