首先看看從lua表中查找一個鍵時的流程:

-- 當從表t中查找鍵k時,lua處理如下:
-- 1.t中是否有k,有則直接返回值,否則第2步
-- 2.t是否有元表, 無則返回nil, 有則第3步
-- 3.t的元表是否有__index元方法, 無則返回nil, 有則查找__index指向的表或對應的方法
---注意兩種寫法
-- 寫法1, 可以保持繼承鏈
local class = {}
function class:new()
self.__index = self
return setmetatable( {}, self )
end
function class:say()
print(111)
end
local o1 = class:new()
o1.say()
local o2 = o1:new()
o2.say()
--- 寫法2, 只能繼承1次, 第2次派生時沒了__index元方法
local class = {}
class.__index = class
function class:new()
return setmetatable( {}, self )
end
function class:say()
print(111)
end
local o1 = class:new()
o1.say()
-- 第2次繼承失敗了, 因為o1並沒有__index元方法
local o2 = o1:new()
o2.say()
