Oop 创建类对象的多个实例。所有对象的数据都等于上次创建的对象

Oop 创建类对象的多个实例。所有对象的数据都等于上次创建的对象,oop,lua,coronasdk,Oop,Lua,Coronasdk,我创建了一个名为Piece的小类,如下所示 local Piece = {} local Piece_mt = { __index = Piece} function Piece.New(name, img, startPosX, startPosY) newPiece = {} newPiece.name = name; newPiece.img = display.newImage(img, startPosX, startPosY); print(new

我创建了一个名为Piece的小类,如下所示

local Piece = {}
local Piece_mt = { __index = Piece}

function Piece.New(name, img, startPosX, startPosY)

    newPiece = {}
    newPiece.name = name;
    newPiece.img = display.newImage(img, startPosX, startPosY);
    print(newPiece.name);

    local function OnHit ( event )
        if event.phase == "ended" then
            print(newPiece.name);
        end
    end

    newPiece.img:addEventListener("touch", OnHit);

    return setmetatable( newPiece, Piece_mt )
end

return Piece
当我创建类时,它打印名称,并且它是正确的(匹配我作为参数传递的内容)。但是,当我稍后单击图像时,由于触发的OnHit函数而打印名称时,打印的名称始终是我创建的最后一个对象的名称,而不管我单击了哪个对象。有人能解释一下为什么会发生这种情况以及如何解决它吗

function Piece.New(name, img, startPosX, startPosY)
    newPiece = {}
    -- process    
    return setmetatable( newPiece, Piece_mt )
end
在这里,您将分配全局变量
newPiece
,并每次返回它。相反,请尝试使用局部变量:

function Piece.New(name, img, startPosX, startPosY)
    local newPiece = {}
    -- process    
    return setmetatable( newPiece, Piece_mt )
end