96SEO 2026-08-15 02:55 2
JavaScript 的面向对象设计既古怪又实用——早期靠“函数+原型”实现封装与继承,ES6 引入 Class 语法后其实仍是原型机制的语法糖。许多开发者对原型链感到困惑,
这篇文章覆盖从手动创建单只猫、批量实例化。到实现猫继承动物通用能力,全程结合可运行代码,拆解 JS 面向对象根本原因。无论你是新手还是想巩固原型链知识,都能通过实操找到关键要点。

JS 早期没有 class,想创建对象全靠“手工建立”。下面这段代码高度还原了这种“原始作坊模式”:
// 先定义个猫的「空模板」
var Cat = {
至于name。"",color: ""
};// 手动捏第一只猫:加菲猫
var cat1 = {};// 先造个空壳
cat1.name = '加菲猫';// 手动填名字
cat1.color = '橘色';// 手动染毛色
// 手动捏第二只猫:黑猫警长
var cat2 = {};// 再造个空壳
cat2.name = '黑猫警长';说起来,cat2.color = '黑色';
这时候你肯定会想:“能不能搞个『猫工厂』?一键批量产猫,”——这就是 JS 面向对象的主要诉求:封装实例化过程,减少重复代码。
构造函数就是 “猫工厂”的第一版蓝图。它把「捏盒子 → 填信息」流程封装成流水线:
// 构造函数= 猫工厂蓝图
function Cat {
console.log;// 打印:Cat {}
this.name = name;// 给空盒子贴名字标签
this.color = color;// 给空盒子染毛色
}
// 坑点预警:没按 new 开关直接调用,会搞破坏!Cat,// this 指向 window,相当于在全局乱贴标签
// 正确操作:按 new 开关启动流水线
const cat1 = new Cat;// 产出第一只 cat
console.log;// 输出:Cat { name: '加菲猫',color: '橘色' }
const cat2 = new Cat;console.log,其实,// true
// 判断这是不是咱工厂的 cat
console.log;// true
构造函数解决了批量创建问题。但隐藏着新的隐患——如果在构造函数里定义方法,每个实例都会生成独立的方法副本,引起内存浪费。
function Cat {
this.name = name;this.color = color;// 每只 cat 都有独立 eat 方法,大量实例极易导致内存膨胀
this.eat = function { alert;},不过,}
const cat1 = new Cat;const cat2 = new Cat;console.log,// false
This shows that every instance gets its own copy of `eat`,wasting memory when you have many cats.
The solution is **prototype**—a shared repository attached to each constructor that holds common properties and methods.
function Cat {
this.name = name;this.color = color;}
// 所有 cats 共用 type 与 eat 方法
Cat.prototype.type = '貓科動物';Cat.prototype.eat = function { console.log;},const cat1 = new Cat;const cat2 = new Cat;console.log,// 猫科动物
console.log;// true
/* 可自行覆盖:
cat1.type ='铲屎官之宠';
console.log,// 铲屎官之宠 猫科动物 */
function Cat{
this.name=name;this.color=color;}
Cat.prototype.type='貓科動物';Cat.prototype.eat=function{ console.log;},不过,const c=new Cat;// .hasOwnProperty 判断是否自己拥有属性
console.log);// true
console.log);// false
// .in 判断是否存在无论自己还是借来的
console.log;// true
console.log;// true
// .isPrototypeOf 判断仓库是否为此实例所用的 prototypical 来源
console.log);// true
// for...in 遍历所有可枚举属性,包括自己和借来的。for {
console.log;/* name Tom /color black/type 貓科動物/eat ƒ */
}
class 并不是新模型。它只是给 原型 模式套了一个外壳,让语法更像传统 OOP。内部逻辑完全依旧是 原型链 + 构造器 + 方法共享。关键点在于了解每一步背后的 “工作细节”。
new 和 prototype 的混乱所困扰。请先熟悉以上两节,再来看看 ES6 Class 如何让代码更易读。
💡 小提醒 💡
当你看到 class 时请记得其实它等价于下面的组合式实现,并非真正的新模型。
js
class Foo{constructor{…}bar{,不过,}}
说到等价于。
js
function Foo{…
}
Foo.prototype.bar=function{…
}
而且即使使用 class 定义。也会在内部做类似以下操作:
Object.setPrototypeOf
Object.defineProperties
如果你还未体会 super 的魔力,那请留意下一节关于继承如何真正把父类初始化交给子类。
🔧 实战演练 🔧
html
``
🛠️ 最终版本👇🏽
javascript class Animal{ constructor{ this.species='动物';} sayHi{ console.log;} }
class Dog extends Animal{constructor{ super;/* 必须先执行父类初始化 */ this.name=name;} }
let d=new Dog;d.sayHi,/* 哪哪哪啦 / d.species / 动物 */
javascript
function Animal{
console.dir;老实说,console.info;/* 如果忘记使用 new,这里指的是 global object */
}
显示为 `` 而不是 `` 对象。从而导致后续访问不存在的方法或属性时产生错误。建议始终记住在调用自定义类型时一定要配合 `new` 使用,以保证正确性和安全性!
🗂️ 小结
-
构造器是一种特殊类型。可以通过关键字
new 创建新的实例,并自动绑定 this 上下文。说起来,
-
原型链确保所有同一类实例可以共享公共方法。提高内存利用率,
-
ES6 Class 提供更直观、更易维护、更接近传统 OOP 的语法糖,但其底层实现仍基于 prototype。
标签:
原型
-
上一篇:
Java基本类型与引用类型有何本质区别?
-
下一篇:
AI智能体安全沙盒如何实战?
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback