With a constructor

Type initialization / Classes

local Phone = {}
Phone.__index = Phone

function Phone.new(model)
  return setmetatable({model = model}, Phone)
end

local Employee = {}
Employee.__index = Employee

-- No overloads: a missing argument is nil
function Employee.new(first_name, last_name,
                      personal_phone)
  return setmetatable({
    first_name = first_name,
    last_name = last_name,
    personal_phone = personal_phone,
  }, Employee)
end

local nokia_phone = Phone.new("Nokia 6610")
local nokia_model = nokia_phone.model
-- nokia_model = Nokia 6610
local kim = Employee.new("Victoria", "Kim",
                         Phone.new("iPhone 18"))
local kim_name = kim.first_name
-- kim_name = Victoria
local kim_model = kim.personal_phone.model
-- kim_model = iPhone 18

-- The third argument is left out
local lee = Employee.new("Ann", "Lee")
local lee_phone = lee.personal_phone
-- lee_phone = nil

print("nokia_model = " .. nokia_model)
print("kim_name = " .. kim_name)
print("kim_model = " .. kim_model)
print("lee_phone = " .. tostring(lee_phone))