local component = {}
component.dirty = false
component.change = function() print("component in change") component.dirty = true end component.__index = component
--component.__newindex = component
local a_component = setmetatable({},component)
a_component.change() print(string.format("1~~~~~~~ a_component dirty = %s",a_component.dirty))
a_component.dirty = false
print(string.format("2~~~~~~~ a_component dirty = %s",a_component.dirty))
a_component.change()
print(string.format("3~~~~~~~ a_component dirty = %s",a_component.dirty))
local b_component = setmetatable({},component)
print(string.format("4~~~~~~~ b_component dirty = %s",b_component.dirty))
观察下,你认为这段程序会输出什么?
从设计层面来说,a_component,和b_component肯定不希望用到的值相互干扰,希望它们是独立的两个class。
但实际的情况是不是像结果一样呢?
看实际输出:
component in change
1~~~~~~~ a_component dirty = true
2~~~~~~~ a_component dirty = false
component in change
3~~~~~~~ a_component dirty = false
4~~~~~~~ b_component dirty = true
但实际的情况是不是像结果一样呢?
并不是,调用原表中才有的方法,改变的是原表中的元数据,而不是子表的数据。
上面程序如果你打印a_component和component各有一个 dirty字段,两者是没有关联的。
如果把上面注释掉的
--component.__newindex = component
给打开,结果会怎样?
输出如下:
component in change
1~~~~~~~ a_component dirty = true
2~~~~~~~ a_component dirty = false
component in change
3~~~~~~~ a_component dirty = true
4~~~~~~~ b_component dirty = true
这时你会发现,a_component和b_componet中都没有dirty这变量。
说明所有的改动都是对component的改动。
网友评论