对GameObject的addComponent理解

cc(self):addComponent(“components.behavior.EventProtocol”):exportMethods()
今天看到这样一句代码,感觉写法比较特殊所以特意好好的理解了下。
首先是cc(self),这句的意思是cc(self)->cc.call(self)->然后去metatable里面找->就找到了framework/cc/init:line 53->所以最后翻译过来就是:
cc.GameObject.extend(self)
这句话就变成了:
cc.GameObject.extend(self):addComponent(“components.behavior.EventProtocol”):exportMethods()
我们暂时把这个self理解为Hero类吧
那这句话又是什么意思呢?打开GameObject.lua里面有5个方法:
Extend(扩展)、checkComponent(检查组件)、addComponent(增加组件)、removeComponent(删除组件)、getComponent(获得组件)
所以我觉得GameObject的功能就是把一个已经做好的组件添加到任何类里面成为类成员的一部分,有点像UML里面的组合关系。我们继续往下看是不是这么一会事。

看看GameObject里面的addComponent,这个方法的Registry.newObject就是通过一个文件的相对路径生成以一个组件对象
例如local StateMachine = Registry.newObject(“components.behavior.StateMachine”)生成一个状态机的组件
然后看component:bind
(self)里面的代码如下

这个的功能是把我们当前的对象Hero绑定成了组件的目标对象(这个是从组件的角度看的一个属性,它需要记住是谁绑定了它),中间的那个for循环是把依赖的对象(如果有的话,因为一个组件有可能依赖其他的组件,所以要一起添加进来)一起添加到当前对象Hero上去,最后调用self:onBind
(target),我把它理解为回调回继承component的组件的一个方法,这里就是StateMachine,里面可以定义一些绑定完成后的工作。
解释到这里cc.GameObject.extend(self):addComponent(“components.behavior.EventProtocol”),这半句话大家应该可以理解了,后面还有一个
exportMethods(),字面上的意思我理解为“扩展方法”。看一下StateMachine里面的exportMethods

调用了self的exportMethods_(),然后我们就找到了component里面的exportMethods_

重点介绍下for循环里面遍历methods(按照上上图看,methods是一个包含方法名字的数组),如果当前目标没有这个方法,就给当前目标分成一个这样的方法,就相当于是拷贝了所有methods里面的方法了。
终于都把一些小细节解释完了,下面我们再从宏观的角度来看这句代码
cc.GameObject.extend(self):addComponent(“components.behavior.EventProtocol”):exportMethods()
用一句话概括就是Hero通过GameObject添加了一个EventProtocol(事件协议),并拷贝了EventProtocol在exportMethods里面传进去的所有方法。
我想问下不知道这样写和继承、组合的区别在哪里?我不太懂。有什么地方写的不对的,请大家指正。