lua不存在类的概念,每个对象定义他自己的行为并拥有自己的形状(shape)。然而,依据基于原型的语言,在lua中仿效类的概念并不难。

在lua中,使用继承的思想,很容易实现prototype(原型),如果我们有两个对象a和b,我们想让b作为a的原型,只需要

1
setmetatable(a,{__index = b})

这样,对象a调用任何不存在的成员函数都会到对象b中去找,术语上,可以将b看做类,a看做对象。

例:为了使得新创建的对象拥有和Account相似的行为。我们使用__index metamethod,使新的对象继承Account,注意一个小小的优化,我们不需要创建一个额外的表作为account对象的metatable,我们可以用Account表本身作为metatable

1
2
3
4
5
6
function  (o)
o = o or {}
setmetatable(o,self)
self.__index = self
return o
end

当我们调用Account:new时,self等于Account,因此可以直接使用Account取代self。有了这段代码之后,当我们创建一个新的账号并且用掉一个方法的时候:

1
2
a = Account:new{balance = 0}
a:deposit(100.00)