lua虚拟机从一个表中查询数据的过程:
- 如果查询对象是表,则尝试根据key在表中查询数据,若有则返回结果;若结果为空,且无__index成员,则返回空结果;若结果为空且有__index,则设查询对象为__index,进行下一层深度的查找;
- 若查询对象不是表,则尝试获取对象的metatale["__index"](usedata可能有此成员),设为查询对象并进行下一层深度的查找;
- 逐层深度向下查找,但有层数限制,超过则终止查找。
由这条特性,我们可以用lua表来实现面向对象,最简单的是将__index指向基类,另一种方法是在实例化对象时直接将基类的成员深拷贝给子类。两种不同方法的差别显而易见:前者不宜多层继承,否则查找成员时一层层找增加额外开销;后者提高了查找效率,但在实例化时会有额外的开销。