lua为了实现类似于c#继承的功能,有setmetatable函数,为一个子脚本设置一个父脚本,这时候就会用到__index和__newindex属性。
__index:当子脚本不存在被访问的元素的时候,lua就会调用__index,去父脚本里面查找该元素。
__newindex:当子脚本不存在被访问的元素,我们却给该元素赋值的时候,默认我们没有给__newindex赋值,lua会直接修改父脚本里面同名元素的值;如果我们给__newindex赋值了,即指定了一个函数,定制了一个我们希望进行的操作,lua就会调用该函数,而不会直接去修改父脚本里面的同名元素的值。
举个例子:
(1)未对__newindex赋值的情况:
local smartMan = {
name = "none",
money = 9000000,
sayHello = function()
print("大家好,我是聪明的豪。");
end
}
local t1 = {};
local mt = {
__index = smartMan,
}
setmetatable(t1, mt);
t1.sayHello = function()
print("en");
end;
t1.sayHello();
[LUA-print] en
(2)对__newindex赋值的情况:
local smartMan = {
name = "none",
money = 9000000,
sayHello = function()
print("大家好,我是聪明的豪。");
end
}
local t1 = {};
local mt = {
__index = smartMan,
__newindex = function(table, key, value)
print(key .. "字段是不存在的,不要试图给它赋值!");
end
}
setmetatable(t1, mt);
t1.sayHello = function()
print("en");
end;
t1.sayHello();
[LUA-print] sayHello字段是不存在的,不要试图给它赋值!
[LUA-print] 大家好,我是聪明的豪。