Lua和JS的继承原理
JavaScript 和 Lua 都是动态语言,支持面向对象编程(OOP),但它们的 继承机制 实现方式不一样。下面分别介绍它们的继承实现原理和方式:
🔶 JavaScript 的继承机制
JavaScript 使用的是 基于原型(prototype-based) 的继承。
✅ ES5 的继承(原型链继承)
function Animal(name) {this.name = name;
}
Animal.prototype.sayHi = function () {console.log("Hi, I'm " + this.name);
};function Dog(name) {Animal.call(this, name); // 构造函数继承
}
Dog.prototype = Object.create(Animal.prototype); // 原型继承
Dog.prototype.constructor = Dog; // 修正构造器指向let dog = new Dog("Buddy");
dog.sayHi(); // 输出:Hi, I'm Buddy
✅ ES6 的继承(class
语法)
class Animal {constructor(name) {this.name = name;}sayHi() {console.log(`Hi, I'm ${this.name}`);}
}class Dog extends Animal {constructor(name) {super(name);}
}const dog = new Dog("Buddy");
dog.sayHi(); // 输出:Hi, I'm Buddy
✅ 本质上,
class
只是对原型链语法的封装,底层仍然是原型继承。
🔷 Lua 的继承机制
Lua 没有类(class),但可以通过 table + metatable 来模拟面向对象继承。
✅ 原型式继承
-- 父类
Animal = {}
Animal.__index = Animalfunction Animal:new(name)local obj = {name = name}setmetatable(obj, self)return obj
endfunction Animal:sayHi()print("Hi, I'm " .. self.name)
end-- 子类继承
Dog = setmetatable({}, {__index = Animal})
Dog.__index = Dogfunction Dog:new(name)local obj = Animal.new(self, name)setmetatable(obj, self)return obj
endlocal dog = Dog:new("Buddy")
dog:sayHi() -- 输出:Hi, I'm Buddy
✅
__index
是 Lua 实现继承和查找“父类”字段的关键。
🔁 对比总结
特性 | JavaScript | Lua |
---|---|---|
面向对象支持 | 内建 class(ES6 起)+ 原型链 | 依赖 table + metatable 自己实现 |
继承机制 | 基于 prototype 原型链 | 基于 __index 的原型式继承 |
实现方式 | Object.create() / class extends | setmetatable(table, {__index = parent}) |
多继承支持 | 不支持 | 可模拟多继承(手动组合多个 __index) |