【发布时间】: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
这里提出了许多问题。
首先,我们用
moduleKeywords变量完成了什么?我不明白那在做什么。其次,
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 实现/扩展。所以我认为这意味着User 与Module 具有相同的形状。到目前为止,这部分是有道理的,简单的继承。但后来我迷路了@extend ORM。
@extend 是Module 上的一个方法,但是extended 方法在做什么呢?什么时候叫?它是如何实现的?
【问题讨论】: