CoffeeScript 类的范围

2024-01-12

我想在类属性中嵌套多个函数,如下所示。
不幸的是,他们无法访问该类的主要范围。

我可以在不传递每个嵌套函数引用的情况下解决这个问题吗this?

class myClass

  constructor: -> @errors = []

  doSomething: -> @errors.push "I work as expected"

  functions:
    doStuff: ->
      @errors.push "I cant access @errors" # => TypeError: Cannot call method 'push' of undefined

    ugly: (context) ->
      context.errors.push "It works, but I am ugly" # Works fine but requires scope injection

使用建议的粗箭头的非工作替代方案:

class myClass
  constructor: ->
    @errors = []

    @functions:
      doStuff: =>
        @errors.push "I wont work either" # TypeError: Cannot call method 'toString' of undefined

可选替代方案,不写入全局this.errors财产:

class myClass

  constructor: ->

    @functions =
      errors: []
      doStuff: ->
        @errors.push "I will write to functions.errors only"

在 JavaScript 中(因此,CoffeeScript 也是如此),方法使用this包含方法的对象的。

method()                  // this == globalObject
object.method()           // this == object
Math.random()             // this == Math

这通常效果很好,除非你处理像你这样的例子:

object.functions.method() // this == object.functions

在处理 JavaScript 时,我会避免使用函数的命名空间 - 即使有解决方法,它也不能很好地发挥作用。例如,您可以尝试引用this对象在object.functions,所以任意函数object.functions将有权访问它。

class MyClass
  constructor: ->
    @errors = []
    @functions.self = this

  doSomething: ->
    @errors.push "I work as expected"

  functions:
    alsoDoSomething: ->
      @self.errors.push "Also works!"

这乍一看似乎有效,但当您使用以下属性时可能会感到困惑apply or call on it, obj1.functions.alsoDoSomething.call(obj2)不会像obj2不是正确的对象(用户应该这样做obj2.functions相反,这可能会令人困惑)。

真正的解决方案是:don't。 JavaScript 不适合这样的滥用。所有对象方法都应该直接位于对象原型中。如果其中有对象,则它的所有方法都不是对象的方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CoffeeScript 类的范围 的相关文章

随机推荐

  • 如何在 C# 中使用 zxing 应用 Reed-Solomon 算法

    我想通过嘈杂的通道传输二进制数据 我读到 Reed Solomon 是一个很好的检测错误的 ECC 算法 问题是我不理解这个算法的输入 这是我对 zxing net 的天真失败的尝试 int toEncode 123 232 432 var
  • git:可靠地切换到分离的 HEAD,然后稍后恢复 HEAD,所有这些都来自脚本

    这是场景 我有一个运行一些测试的脚本 我需要制作另一个接受 git 提交名称作为参数的脚本 然后执行以下操作 保存当前提交状态 分支名称或未命名提交 在指定的提交处切换到分离的 HEAD 针对该提交运行测试脚本 切换回来 因此 HEAD 与
  • 找不到用于渲染完成的 ReportViewer 事件

    当 ReportViewer 控件完成渲染时 我试图触发一个事件 以删除自定义进度 状态指示器 我已经研究了 ReportViewer 控件的事件 但似乎找不到在报表完成时实际触发的事件 我正在使用 Visual Studio 2010 和
  • 将标签放置在分档/步进颜色条指南中分档的中间?

    推理 我想轻松使用现成的连续刻度 来自任何提供的包 scale continuous等 对于类似序数因子的数据 例如mtcars cyl 因为这些数据只包含几种离散值 所以我想直接标记图例键 而不是容器限制 怎么做 library ggpl
  • 如何在写入 CSV 文件时附加到新行[重复]

    这个问题在这里已经有答案了 我想在写入时附加到 CSV 文件中的新行 当前的 CSV 文件如下所示 a b c 1 1 1 我的附加到 CSV 文件的代码 with open mycsvfile csv a as f writer csv
  • 如何实现更高效的搜索功能?

    在我的数据库中有 3 列 分别是姓名 年龄 性别 在程序中 我只想使用 1 个搜索按钮 单击该按钮时 程序会确定哪 3 个文本框已输入并搜索正确的数据 您如何处理查询 例如 如果姓名和性别有文本 则查询 Select from table
  • Java 中的类型转换和自动类型提升

    让我们考虑一下 Java 中的一些简单表达式 byte var 0 var byte var 1 这里 在上面的语句中 显然由于自动类型提升而需要类型转换 表达式的评估 var 1 自动提升为 int 因此 必须显式转换为 byte 以将其
  • 在运行时更改时,表单验证会忽略语言

    我正在使用 CodeIgniter 构建多语言 Web 应用程序 我有英语和其他语言 system languages 文件夹 我创建了一个负责在运行时更改工作语言的模型 默认情况下 CodeIgniter 以法语工作 如中定义 appli
  • 将 S3 上传/浏览与 django-tinymce 集成

    我一直在寻找有关如何将 Amazon S3 与 TinyMCE 集成的资源 到目前为止我想到的最好的链接是 http forums aurigma com yaf postst4033 Amazon S3 File Manager for
  • Bootstrap 下拉菜单 - 不适用于子页面

    我正在使用引导程序并创建了一个下拉菜单 主要项目是一个在主页上有效但在子页面上无效的链接 这是我的代码 li a href preview design centre class dropdown toggle scroll Design
  • 如何使用Rete算法

    如何在java中使用Rete算法 我需要编写自己的算法实现吗 或者是否有已经实现的库可用 所以这是一个相当老的问题 但如果你在谷歌上搜索 Rete 实现 那么排名很高 所以我会在这里留下一些信息 维基百科条目 http en wikiped
  • 主干路由器侦听器未命中哈希标签

    我的问题是 当我在链接中使用哈希标签时 它只是将哈希附加到 url 而不是转到路由 例如 ToDo public offline2 html test 如果我离开tag 由于某种原因它确实会转到路由器 我已经用以下代码关闭了 jquery
  • 本地通知未根据时区进行调整

    我正在安排一个带有 NSDate 的本地通知 时间设置为晚上 9 点 并将通知的时区设置为 UTC GMT 如果我将设备时区设置为 UTC 时间设置为晚上 8 59 则通知将按预期在晚上 9 点触发 但是 如果我将设备时区设置为美国西海岸
  • Clojure 交换!原子出队

    有没有更简单的方法在 Clojure 中编写此代码 def queue atom top nil queue PersistentQueue EMPTY swap queue hash map top nil queue conj queu
  • 如何阻止来自中国的请求?

    我有一个比较流行的 API 每天 10 000 多个请求 每天从某个 IP 地址发出 10 个请求后 我会返回一条消息 告诉用户如果想更多地使用该服务 则需要支付一些现金 今天早上 我发现我的网络服务运行速度非常慢 我检查了数据库 发现我收
  • PHP 中值对象的示例是什么?

    我读过很多值对象的 C 示例 并且我知道它是一个由其值标识的 对象 如果值发生变化 则该对象是 新的 然而 当涉及到 PHP 时 这似乎没有意义 要么是这样 要么我只是没有建立联系 值对象只是一个字符串吗 为了将这一点放在上下文中 在许多面
  • Java 8 中限制 groupBy

    如何按每个条目限制 groupBy 例如 基于这个例子 流分组依据 http www leveluplunch com java examples java util stream groupingBy example studentCla
  • 禁用 awt/swing 调试(精细)日志消息

    我正在使用 java 日志记录将应用程序的日志消息写入日志文件和其他目的地 将日志级别设置为FINE 我还从 AWT Swing 收到 不需要的 消息 例如 0 when grabbed 1 contains 2 和别的 查看 JDK 源代
  • Android - 如何隐藏/显示进度条onclick

    我试图在单击按钮时显示进度条 当我测试应用程序时 它强制关闭 停止 在添加进度条代码之前 我的应用程序运行良好 如果这很重要的话 我也使用切换按钮 并且我想要旋转的进度条而不是对话框 有什么帮助吗 这是我的代码 Override publi
  • CoffeeScript 类的范围

    我想在类属性中嵌套多个函数 如下所示 不幸的是 他们无法访问该类的主要范围 我可以在不传递每个嵌套函数引用的情况下解决这个问题吗this class myClass constructor gt errors doSomething gt