__newindex

前面说过__index,与__index不同的是,__newindex用于更新,而__index用于查找。当对一个table不存在的字段进行赋值时,就会查找__newindex元方法。如果存在这个元方法,就执行它。如果这个元方法是table,那么久对此table赋值,而不是原table。

window = {}
window.prototype = {x = 20, y = 30, width = 100, height = 200}
window.mt = {}
window.new = function(o)
   setmetatable(o,window.mt)
   return o
end

window.mt.__index = window.prototype
window.mt.__newindex = function(table,key,value)
     print("excu  __newindex....")
end


w = window.new{x= 50, y = 60}
print(rawget(w,w.width))   -->nil
w.xy = 40    -->excu  __newindex....

w中并不存在字段xy,因此执行__newindex方法

 

如果想对xy字段赋值,则修改__newindex方法如下:

mt.__newindex = function(table,key,v)

    rawset(t,key,v)
end

这里需要使用rawset,如果不这样,而进行直接赋值,则会陷入死循环,因为不存在xy字段就会一直查找。

 

posted @ 2015-09-20 15:52  烂橘子  阅读(224)  评论(0编辑  收藏  举报