As others have said, self
(the Account
table) is used as a metatable assigned to the objects created using new
. Simplifying slightly (more info available at the links provided) when a field is not found in 'o', it goes to the 'Account' table because o's metatable says to go to Account (this is what __index
does).
It does not, however, need to be executed every time an object is created. You could just as easily stick this somewhere:
Account.__index = Account
and it would work as well.
The somewhat longer story is that if an object o
has a metatable, and that metatable has the __index
field set, then a failed field lookup on o
will use __index
to find the field (__index
can be a table or function). If o
has the field set, you do not go to its metatable's __index
function to get the information. Again, though, I encourage you to read more at the links provided above.