当前位置: 首页 > article >正文

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 实现继承和查找“父类”字段的关键。


🔁 对比总结

特性JavaScriptLua
面向对象支持内建 class(ES6 起)+ 原型链依赖 table + metatable 自己实现
继承机制基于 prototype 原型链基于 __index 的原型式继承
实现方式Object.create() / class extendssetmetatable(table, {__index = parent})
多继承支持不支持可模拟多继承(手动组合多个 __index)

http://www.lryc.cn/news/2402803.html

相关文章:

  • 灵活控制,modbus tcp转ethernetip的 多功能水处理方案
  • boost::qvm 使用示例
  • go语言学习 第6章:错误处理
  • VMware 安装 CentOS8详细教程 (附步骤截图)附连接公网、虚拟机yum源等系统配置
  • Editing Language Model-based Knowledge Graph Embeddings
  • 深入了解linux系统—— 进程池
  • JavaScript 原型与原型链:深入理解 __proto__ 和 prototype 的由来与关系
  • 逻辑回归与Softmax
  • vscode .husky/pre-commit: line 4: npx: command not found
  • 光电耦合器:数字时代的隐形守护者
  • FPGA没有使用的IO悬空对漏电流有没有影响
  • 11. vue pinia 和react redux、jotai对比
  • 手机如何防止ip关联?3种低成本方案
  • Pandas和Django的示例Demo
  • 护网行动面试试题(1)
  • 【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信拓扑与操作 BR/EDR(经典蓝牙)和 BLE
  • 航道无人机巡检系统
  • 【JVM】Java虚拟机(一)——内存结构
  • 从微积分到集合论(1630-1910)(历史简介)——第4章——现代积分理论的起源(Thomas Hawkins)
  • 《Linux运维总结:宝德服务器RAID开启(方式一)》
  • NY118NY120美光固态闪存NY124NY129
  • Odoo 19 路线图(新功能)
  • 基于NXP例程学习CAN UDS刷写流程
  • RNN循环网络:给AI装上“记忆“(superior哥AI系列第5期)
  • Python训练第四十三天
  • 基于有效集MPC控制算法的直线同步电机simulink建模与仿真,MPC使用S函数实现
  • 让敏感数据在流转与存储中始终守护在安全范围
  • 【Linux】find 命令详解及使用示例:递归查找文件和目录
  • Java转Go日记(五十九):参数验证
  • 机器学习与深度学习14-集成学习