javascript - 在 lua 中模拟 javascript `this` 行为

标签 javascript lua

我一直很喜欢在 Javascript 中,您可以通过执行 f.call(newThisPtrValue) 来设置 this 指针的值。我在 lua 中写了一些东西来做这个,它有效:

_G.call = function(f, self, ...)
    local env = getfenv(f)
    setfenv(f, setmetatable({self = self}, {__index = env}))
    local result = {f(...)}
    setfenv(f, env)
    return unpack(result)
end

有几件事我不确定:

  1. 我预计 unpack({...}) 会产生性能开销。有解决办法吗?
  2. 这是否可能以任何方式严重破坏函数的环境?
  3. 这是一个非常糟糕的主意吗?

最佳答案

Lua 的伪 OOP 的一个极好的好处是它已经非常容易做到这一点:

local Person = {}
function Person:create( firstName, lastName )
  local person = { firstName=firstName, lastName=lastName }
  setmetatable(person,{__index=self})
  return person
end
function Person:getFullName()
  return self.firstName .. " " .. self.lastName
end
local me  = Person:create( "Gavin", "Kistner" )
local you = Person:create( "Eric", "Someone" )
print( me:getFullName() )
--> "Gavin Kistner"
print( me.getFullName( you ) )
--> "Eric Someone"

我写了一篇文章讨论这个(除其他外):
Learning Lua: Pseudo-OOP Syntax and Scope .

编辑:这是一个类似 jQuery 的 each 的连续示例:

local Array = {}
function Array:new(...)
  local a = {...}
  setmetatable(a,{__index=self})
  return a
end
function Array:each(callback)
  for i=1,#self do
    callback(self[i],i,self[i])
  end
end
function Array:map(callback)
  local result = Array:new()
  for i=1,#self do
    result[i] = callback(self[i],i,self[i])
  end
  return result
end
function Array:join(str)
  return table.concat(self,str)
end

local people = Array:new( me, you )

people:each( function(self,i)
  print(self:getFullName())
end )
--> "Gavin Kistner"
--> "Eric Someone"

print( people:map(Person.getFullName):join(":") )
--> "Gavin Kistner:Eric Someone"

关于javascript - 在 lua 中模拟 javascript `this` 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6110738/

相关文章:

javascript - 线路按钮动画

Javascript 非对称加密和认证

JavaScript + div 标签

c++ - 如何使用 gdb 从核心文件中获取 lua 堆栈跟踪

c++ - 有条件地从 C++ 调用 Lua 函数

nginx - Openresty torch 模块加载问题

python - string.unpack ('<I2s2' , data) 在Lua脚本中是什么意思?

haskell - 在 Windows 上使用 HsLua 出现链接错误

javascript - 如何从Json文件中以 Angular 填充选择

javascript - 多个条件无效的 for 循环 (JS)