lua中的table就是一种对象。lua中可以通过修改元表元方法来实现面向对象。
self
table中的self相当于this。
table与对象一样可以拥有状态table也与对象一样拥有一个独立于其值的标识(一个self)table与对象一样具有独立于创建者和创建地的生命周期
lua只需使用冒号,则能隐藏self参数:
1 | function Account:withdraw(dollar) |
__index
一个类就像是一个创建对象的模具。我们可以利用__index元方法构造继承。
当访问一个table中不存在的字段时,得到的结果为nil。这是对的,但并非完全正确。实际上,这些访问会促使解释器去查找一个叫__index的元方法。如果没有这个元方法,那么访问结果如前述的为nil。否则,就由这个元方法来提供最终结果。
在lua中,将__index元方法用于继承很普遍,__index还可以是一个table。
1 | function Account:new(obj) |
self.__index = self做这个操作是因为self作为元表返回了,也就是查找的时候会进入table创建时的3个步骤。
lua类的实现
可以参考cocos2d-x自己给出的lua类的实现:
luaClass.lua
创建对象时,可以通过className.new这种方式来创建,如:
1 | local MySpriteClass = class("MySpriteClass",cc.Sprite) |
mySpriteClass实例创建:
1 | local mySprite = MySpriteClass.new(xxx.png) |

classname.new()生成的instance包含一个class属性。class指向了类原型,并具有super,ctor,__cname和__ctype4个属性。
继承
C++的类,new方法使用__create函数来创建实例
继承lua类,new方法使用{ }来创建实例。