为什么 SuperClass:initialize() 与 lua 中的 SuperClass.initialize(self) 不同?

Why is SuperClass:initialize() different from SuperClass.initialize(self) in lua?

在使用middleclass的时候遇到了一个奇怪的问题:

ParentClass = class('ParentClass') 

function ParentClass:initialize(param)
   self.param = param
end

现在这将起作用:

Child1 = class('Child1', ParentClass)

function Child1:initialize(param)
  ParentClass.initialize(self, param)
end

但这不会:

Child2 = class('Child2', ParentClass)

function Child2:initialize(param)
  ParentClass:initialize(param)
end  

创建像 Child2 这样的子项将导致修改 param 不是针对单个实例,而是针对从 ParentClass 继承的所有子项。

我花了很长时间才确定这个问题,因为我确信 Object:function() 只是 Object.function(Object) 的语法糖,因此应该是相同的。这似乎不是中产阶级的问题,因为我之前使用的另一个 OO 库显示出类似的问题...

我在这里错过了什么?

function Child1:initialize(param)
  ParentClass.initialize(self, param)
end

等同于

function Child1:initialize(param)
  ParentClass.initialize(Child1, param)
end

所以self

function ParentClass:initialize(param)
   self.param = param
end

将参考Child1

同时

function Child2:initialize(param)
  ParentClass:initialize(param)
end  

等同于

function Child2:initialize(param)
  ParentClass.initialize(ParentClass, param)
end

所以self

function ParentClass:initialize(param)
   self.param = param
end

将参考ParentClass

因此代码段 1 将初始化 Child1,而代码段 2 将初始化基础 class。