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

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.lqws.cn/news/109639.html

相关文章:

  • SAP学习笔记 - 开发20 - 前端Fiori开发 Nest View(嵌套视图) ,Fragment(片段)
  • 吞咽与营养并重:进行性核上性麻痹的饮食之道
  • 什么是“音节”?——语言构成的节拍单位
  • FreeRTOS,其历史争议、兼容性、生态、未来展望
  • MYSQL索引详解及索引优化、分析
  • MyBatis常用注解全解析:从基础CRUD到高级映射
  • RL中的熵机制:策略熵坍缩分析与协方差正则化方法
  • 【FreeRTOS#1】多任务处理任务调度器任务状态
  • 【计算机网络 第8版】谢希仁编著 第六章应用层 题型总结1 编码
  • 队列的讲解:C++队列的使用
  • C++ set数据插入、set数据查找、set数据删除、set数据统计、set排序规则、代码练习1、2
  • 6月2日day43打卡
  • 【Python进阶】元类编程
  • 基于c++面向对象的设计(下)
  • 亚马逊Woot提报常见问题第一弹
  • C#基础:使用线程池执行并行任务
  • 蓝绿部署解析
  • 【leetcode-两数之和】
  • 笔记本电脑开机无线网卡自动禁用问题
  • 开源模型应用落地-OpenAI Agents SDK-集成Qwen3-8B(一)
  • 【北邮 操作系统】第十三章 I/O系统
  • 推荐算法八股
  • git clone报错:SSL certificate problem: unable to get local issuer certificate
  • 金融中的线性优化:投资组合分配与求解器 - Part 2
  • 【大模型】ChatGLM训练框架
  • R1-Searcher++新突破!强化学习如何赋能大模型动态知识获取?
  • 产品更新丨谷云科技ETLCloud 3.9.3 版本发布
  • Qiskit:量子计算模拟器
  • 深入理解汇编语言中的顺序与分支结构
  • 19-项目部署(Linux)