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 = Animal

function Animal:new(name)
    local obj = {name = name}
    setmetatable(obj, self)
    return obj
end

function Animal:sayHi()
    print("Hi, I'm " .. self.name)
end

-- 子类继承
Dog = setmetatable({}, {__index = Animal})
Dog.__index = Dog

function Dog:new(name)
    local obj = Animal.new(self, name)
    setmetatable(obj, self)
    return obj
end

local 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)
相关推荐
半个落月5 小时前
LangChain.js Agent Memory 实战(下):用 Milvus 构建可检索的长期记忆
javascript·langchain
半个落月5 小时前
LangChain.js Agent Memory 实战(上):从内存对话、文件持久化到截断与摘要
javascript·langchain
linux_cfan7 小时前
17 · 引擎适配器全景:HLS/DASH/Vimeo/Mux/Cast
前端·javascript·音视频
何何____9 小时前
Vue 生命周期详解
前端·javascript
默_笙11 小时前
💫 闭包是个背包:拆解小米前端面试题里的三道"闭包陷阱"
前端·javascript·面试
尾善爱看海13 小时前
《JavaScript 数组操作全攻略:12 类 API + 30 个实战场景 + 20 个避坑指南》
前端·javascript·面试
OpsEye14 小时前
为什么你的 Agent 莫名烧钱?聊聊循环调用的兜底方案
javascript·ai编程
linux_cfan14 小时前
16 · `custom-media-element`:属性拦截与转发
前端·javascript·音视频
右耳朵猫AI14 小时前
Web前端周刊2026W38 | React 19.3 发布、StyleX 深潜、jsdom 30.1 提速
前端·javascript·react.js·typescript·node.js
落魄大学生之流水线上谋生计14 小时前
GreenLife Carbon · OpenHarmony 智慧低碳生态平台
javascript