People = {name='Chicai'} function People:New(o,name) o = o or {} setmetatable(o,self) self.__index = self name = name or 'Chicai' self.name = name return o end function People:printName() print(self.name) end me = People:New() me:printName()
声明类People,其实是个Table,New方法用来创建实例,创建一个新的table-o代表实例,设置新table的元表为self就是People类,设置元表的__index元方法为self也还是People类,这样很绕,但是想想o就可以访问People定义好的属性和方法了。
me是一个元表为People的table(对象),me访问方法printName时,发现me没有这个方法,就会去元表的__index里面找,找到People:printName并调用,但是self参数传入的是me,调用me.name,同样找不到,到元表中的_index中找。