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 Boy = People:New({sex='boy'}) function Boy:printSex() print(self.sex) end me = Boy:New() me:printName() me:printSex()
Boy是People的一个对象(Boy的元表的__index方法是People),Boy有自己的属性sex和方法printSex
me是Boy的一个对象,Boy调用继承过来的New方法,但是self参数改为了Boy,也就是说me的元表的__index是Boy
当me调用方法,在me中找不到时,就会去Boy的__index(还是Boy)中找,Boy也找不到,就去People找,调用时,self为me了