【问题标题】:How to better understand Coffeescript/JavaScript mixins?如何更好地理解 Coffeescript/JavaScript mixin?
【发布时间】:2016-09-17 02:55:53
【问题描述】:

我一直在阅读使用 Coffeescript 或只是从以下来源的纯 Javascript 的 Mixins:

http://arcturo.github.com/library/coffeescript/03_classes.html(靠近底部)

http://javascriptweblog.wordpress.com/2011/05/31/a-fresh-look-at-javascript-mixins/

虽然我能够编译各种示例,但我有一个主要问题似乎阻碍了我在理解它们方面取得进展。

我不知道世界上发生了什么。首先,我将解释让我感到困惑的 Coffeescript。

moduleKeywords = ['extended', 'included']

    class Module
      @extend: (obj) ->
        for key, value of obj when key not in moduleKeywords
          @[key] = value

        obj.extended?.apply(@)
        this

      @include: (obj) ->
        for key, value of obj when key not in moduleKeywords
          # Assign properties to the prototype
          @::[key] = value

        obj.included?.apply(@)
        this

这里提出了许多问题。

  1. 首先,我们用moduleKeywords 变量完成了什么?我不明白那在做什么。

  2. 其次,extended?.apply(@) 是如何工作的?这里到底发生了什么?我可以看一下JavaScript编译,看到下面的代码..

Module.extend = function(obj) {
      var key, value, _ref;
      for (key in obj) {
        value = obj[key];
        if (__indexOf.call(moduleKeywords, key) < 0) {
          this[key] = value;
        }
      }
      if ((_ref = obj.extended) != null) {
        _ref.apply(this);
      }
      return this;
    };

任何人都可以对此有所了解吗?

The Little Book on Coffeescript 的更深处,我看到了一个实现。

ORM = 
  find: (id) ->
  create: (attrs) ->
  extended: ->
    @include
      save: -> 

class User extends Module
  @extend ORM

这是我的阅读方式:

  • 创建文字ORM
  • 声明方法find接受一个参数。
  • 声明方法“create”接受一个参数。
  • 声明方法“扩展”,子方法“包含”,子方法“保存”。

这是我最失落的地方。

文字ORM 有一个方法extended,然后Module 由“类”User 实现/扩展。所以我认为这意味着UserModule 具有相同的形状。到目前为止,这部分是有道理的,简单的继承。但后来我迷路了@extend ORM

@extendModule 上的一个方法,但是extended 方法在做什么呢?什么时候叫?它是如何实现的?

【问题讨论】:

    标签: javascript coffeescript


    【解决方案1】:
    • extend 将“模块”对象中的方法复制到正在扩展的对象上
    • include 将方法从“模块”对象复制到被扩展对象的原型

    1moduleKeywords是用来保护模块的一些方法的,所以不会复制到对象中,因为它们有特殊的含义

    2 extended?.apply(@) 表示 如果模块有一个名为 extended 的属性,则假设它是一个函数,然后调用这个函数,函数中的“this”等于 @,@ 是扩展对象,你可以把它想象成类似(虽然不完全,但这只是一种直觉)@.extended()(@ == 咖啡脚本中的 this)

    "apply" function in JS
    the existential operator in CS

    【讨论】:

      【解决方案2】:

      您对 extendedincluded 模块关键字的含义和用法感到困惑。但是书中解释说,这些在扩展和包含之后用作回调

      所以在最后一个例子中,ORM 有“扩展”回调。 “extend”函数将在结束时调用“extended”并将其传递给@(或this,或在我们的示例中为User),因此@(this.)include 也将在User 上运行,并将包含函数“save”。

      你也可以反过来做:

      ORM = 
        save ->
        included: ->
          @extend
            find: (id) ->
            create: (attrs) ->
      
      class User extends Module
        @include ORM
      

      【讨论】:

        猜你喜欢
        • 2016-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-04
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        • 2023-03-19
        相关资源
        最近更新 更多