编辑代码

-- 程序运行完成时一定要有输出语句,本工具才能正确展示运行结果。
Event = {}

function Event:new(event)
	local event = event or {}
	setmetatable(event, self)
	self.__index = self
	return event
end

function Event:Instance()
	if not self.instance then
		self.instance = self:new()
		self._listeners = {}
	end
	return self.instance
end

function Event:addEventListener(listener, eventType, callback)
	-- assert(eventType)
	-- assert(type(listener) == 'table')
	-- assert(type(eventType) == 'string')
	-- assert(type(callback) == 'function')
	print(listener, eventType, callback)
	if not self._listeners[eventType] then
		self._listeners[eventType] = {}
	end
	self._listeners[eventType][listener] = callback
end

function Event:delEventListener(listener, evenType)
	if not evenType then
		for ev, es in pairs(self._listeners) do
			es[listener] = nil
		end
	else
		local es = self._listeners[evenType]
		if es then
			es[listener] = nil
		end
	end
end

function Event:dispatchEvent(eventType, ...)
	if not self._listeners then return end
	local callbacks = self._listeners[eventType]
	if callbacks then
		for listener, func in pairs(callbacks) do
			listener[func](listener, ...)
		end
	end
end

A = {}

function A:a()
	local event = Event:Instance()
	event:addEventListener(self, 'eat', 'getName')	
end

function A:getName()
	print("aaaaaaaaaaaaaaaaaaaaaaaaa")
end

function A:set()
	local event = Event:Instance()
	event:dispatchEvent('eat')
end

A:a()
A:set()






----------------------------------newproxy------------------------
-- function a()
-- 	print("rrrrrrrrrrrrr")
-- end
-- local p = newproxy(true)
-- local mt = getmetatable(p)
-- mt.__gc = function () a() end
-- print("111111111111111111111111111")
-- print(mt ~= nil)

-- local b = newproxy(p)
-- local m = getmetatable(b)
-- print("22222222222222222222222")
-- print(mt == m)

-- local c = newproxy(false)
-- print(getmetatable(c) ~= nil)