首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用CoffeeScript应用装饰器模式来扩展对象?

如何使用CoffeeScript应用装饰器模式来扩展对象?
EN

Stack Overflow用户
提问于 2014-05-28 13:29:28
回答 1查看 512关注 0票数 0

我正在尝试创建一个节点模块,它将与github API交互,但将在redis中缓存结果。您可以在https://github.com/shamoons/github-redis-etag跟踪我的进度(请,请叉我!)作为基地,我使用的 package由mikedeboer。

我想要做的是创建一个类,它扩展了GitHubApi模块的功能,并在调用Github调用之前调用了一些redis魔术。到目前为止,我得到的是:

代码语言:javascript
复制
_ = require 'lodash'
base91 = require 'base91'
GitHubApi = require 'github'
redis = require 'redis'
util = require 'util'

class GitHubETag extends GitHubApi
  repos = {}

  constructor: (defaults = {}) ->
    @github = new GitHubApi
      version: '3.0.0' || defaults.version?
      debug: false || defaults.false?
      protocol: 'http' || defaults.protocol?
      host: null || defaults.host?
      pathPrefix: '' || defaults.pathPrefix?
      timeout: null || defaults.timeout?

    @redisClient = redis.createClient ('6379' || defaults.redis?.port?), ('127.0.0.1' || defaults.redis?.host?)

    githubObjects = ['events', 'gists', 'gitdata', 'issues', 'markdown', 'orgs', 'pullRequests', 'repos', 'search', 'statuses', 'user']

    _.each githubObjects, (object) =>
      @object = {}

      _.each _.keys(@github[object]), (key) =>
        fn = @github[object][key]
        @object[key] = @github[object][key]
        console.log "#{object}:#{key}"

我意识到这一切都是错误的。为了实例化它,我正在做:

代码语言:javascript
复制
github = new GitHubETag
  version: '3.0.0'
  redis:
    port: '6379'
    host: '127.0.0.1'

console.log github

这也是错误的,因为这将返回与GitHubApi相同的对象,除非github:等于所有这些。所以如果有人有任何建议或建议,我会非常感激的。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-29 20:09:44

你的问题是:@github = new GitHubApi(args...)

您不必从构造函数内部调用带有父类的新构造函数,它违背了目的。而且,由于构造函数是类主体中的唯一方法,所以在调用子类上的new时,所有的方法都会被返回。您还可以为默认参数重写构造函数,如下所示。

代码语言:javascript
复制
class GitHubETag extends GitHubApi
  repos = {}

  constructor: ({@version, @debug}) ->
    @version ?= '3.0.0'
    @debug ?= false
    etc..


instance = new GitHubETag(version: '2.0.0')
instance.version #=> '2.0.0'
instance.debug #=> false

我不太确定构造函数底部的每个循环的使用情况,所以我不能在那里进行注释,但是如果您只是试图动态地在实例上设置方法,则不必这样做,因为您是在扩展超类。如果这些方法不需要任何子类方差,那么它们已经定义好了。使用上面的代码,您应该能够:

代码语言:javascript
复制
instance.events #=> function
superclass = new GitHubApi()
instance.events == superclass.events #=> true

若要覆盖父类方法或在父类方法之前执行工作,请定义该方法,执行该工作,然后调用超级:

代码语言:javascript
复制
class GitHubETag extends GitHubApi
  gists: ()->
    console.log "doing work"
    super

instance.gists() #=> logs and calls through
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23912997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档