Object Prototypes
In Lua, object-oriented programming is achieved using prototypal inheritance, since Lua does not have the concept of a class. Prototypal inheritance simply means that objects can refer to a "prototype" object which is looked up when any field doesn't exist in the first object. In Lua, this is achieved by using the __index
Lua Table-Access Metamethods. In the example, I'm creating a Person
table which will serve as a metatable for all instances of a Person
:
local Person = {firstName='', lastName='', age=nil}
function Person:new(o)
local o = o or {}
setmetatable(self, o)
self.__index = self
return o
end
function Person:getName()
return self.firstName..' '..self.lastName
end
local me = Person({firstName='Lex', lastName='T', age=34})
print(me:getName())
I can then extend Person by creating a new object with modified parameters:
local PersonWithMiddleName = Person:new()
PersonWithMiddleName.middleName = ''
local me = PersonWithMiddleName(firstName='Lex', lastName='T', age=34, middleName='D')
In that example, the me
object will be consulted for fields. If they aren't found, PersonWithMiddleName
will be looked up. If not found, since it uses Person
as the __index
metatable, Person
will then be consulted.
Javascript also uses prototypal inheritance at the core of its object-oriented paradigm.
References: