Определение свойства get для моего одноэлементного класса в CoffeeScript - PullRequest
1 голос
/ 08 декабря 2011

Это вспомогательная функция, которую я определяю для создания свойств в моих классах:

###
# 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

Внутри файла у меня есть два класса ниже, Folds и _Folds, последний скрыт, и только первый экспортируется (с пространством имен) в глобальный.

###
  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

Я не могу вызвать Folds.Factory.create (), потому что Folds.Factory не определена.

1 Ответ

2 голосов
/ 08 декабря 2011

CoffeeScript in предназначен для массивов (и массивоподобных объектов); of компилируется в in JavaScript. Итак, что вы хотите, это

console.log 'Factory' of Folds

Однако это не основная проблема: основная проблема в том, что используемый вами метод public на самом деле определяет свойство с данным именем в классе ' prototype как строку

Object.defineProperty @prototype, name, config

говорит нам. То, что вы действительно хотите - это

console.log 'Factory' of Folds.prototype  # should be true

, что означает, что метод Factory будет доступен как свойство каждого экземпляра Folds.

...