gpt4 book ai didi

javascript - 如何更好地理解 Coffeescript/JavaScript 混入?

转载 作者:可可西里 更新时间:2023-11-01 01:43:36 26 4
gpt4 key购买 nike

我一直在阅读有关使用 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 由 'class' User< 实现/扩展。所以我认为这意味着 UserModule 具有相同的形状。到目前为止,那部分是有意义的,简单的继承。但是后来我迷失了 @extend ORM

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

最佳答案

  • extend 将方法从“模块”对象复制到被扩展的对象上
  • include 将方法从“模块”对象复制到被扩展对象的原型(prototype)

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

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

"apply" function in JS
the existential operator in CS

关于javascript - 如何更好地理解 Coffeescript/JavaScript 混入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8728074/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com