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

10.JavaScript 中的类和对象以及继承

可枚举属性的补充

varobj={name:'why',age:18}Object.defineProperty(obj,'address',{value:'北京',})// address 是不可枚举的,但是属性在浏览器里面会展示成灰色的,这个是为了方便我们调试console.log(obj);

JavaScript 中的类和对象

functionPerson(name,age){}varp1=newPerson('why',18)
  • 在 JavaScript 中 Person 应该称之为一个构造函数
  • 从很多面向对象语言过来的开发者,也习惯称之为类

面向对象的特性-继承

面向对象的三大特性:封装、继承、多态

  • 封装:将属性和方法封装到一个类中,可以称之为封装的过程
  • 继承:子类继承父类,可以复用父类的功能,并且对父类进行扩展
  • 多态:不同的对象在执行时表现出不同的形态

继承可以帮助我们将重复的代码和逻辑抽取到父类中,子类只需要继承父类即可,而不需要重复编写相同的代码

JavaScript 原型链

从一个对象上获取属性,如果在当前对象中没有获取到就会去它的原型上面获取

varobj={name:'张三',age:18}// [[Get]]操作// 1. 先从obj对象中查找属性// 2. 如果obj对象中没有,则从原型(__proto__)中查找console.log(obj.address);obj.__proto__={}obj.__proto__.__proto__={}obj.__proto__.__proto__.__proto__={address:'北京'}console.log(obj.address);

Object 的原型

顶层原型是什么?

varobj={name:"why"}console.log(obj.address);// 到底是找到哪一层对象之后停止继续查找了呢?console.log(obj.__proto__);// 字面量对象 obj 的原型是 [Object: null prototype] {}// [Object: null prototype] {} 就是顶层的原型console.log(obj.__proto__.__proto__);

顶层原型来自哪里?

varobj1={}// 创建一个对象varobj2=newObject()// 创建一个对象// Object.prototype // 顶层原型console.log(obj2.__proto__===Object.prototype);functionObject(){}// Object.prototype // 顶层原型 Object 的原型对象// Object.prototype.constructorconsole.log(Object.getOwnPropertyDescriptors(Object.prototype));

[Object: null prototype] {}原型有什么特殊?

  • 该对象有原型属性,但是它的原型属性已经指向的是 null,也就是已经是顶层原型了
  • 该对象上有很多默认的属性和方法

原型链关系的内存图

Object 是所有类的原型

原型链最顶层的原型对象就是 Object 的原型对象

functionPerson(){}console.log(Person.prototype.__proto__);console.log(Person.prototype.__proto__.__proto__);

实现继承

为什么需要有继承

代码方法重复

functionStudent(name,age){this.name=name;this.age=age;}Student.prototype.running=function(){console.log(this.name+" is running");}Student.prototype.eating=function(){console.log(this.name+" is eating");}Student.prototype.studying=function(){console.log(this.name+" is studying");}functionTeacher(name,age,title){this.name=name;this.age=age;this.title=title;}Teacher.prototype.running=function(){console.log(this.name+" is running");}Teacher.prototype.eating=function(){console.log(this.name+" is eating");}Teacher.prototype.teaching=function(){console.log(this.name+" is teaching");}

原型链的继承方案

// 父类:公共属性和方法functionPerson(){this.name='why';}Person.prototype.eating=function(){console.log(this.name+" eating");}// 子类:特有属性和方法functionStudent(){this.sno=111;}// 原型链继承varp=newPerson();Student.prototype=p;Student.prototype.studing=function(){console.log(this.name+" studying");}varstu=newStudent();console.log(stu.name);stu.eating()

原型链实现继承的弊端:

  • 1、打印 stu 对象,继承的属性是看不到的
  • 2、创建出来两个 stu 的对象
varstu1=newStudent();varstu2=newStudent();// 获取引用,修改引用中的值,会相互影响stu1.friends.push('kobe');console.log(stu2.friends);// 直接修改对象上的属性,是给本对象添加了一个新属性stu1.name='kobe';console.log(stu2.name);
  • 3、在前面的实现类的过程中都没有传递参数
varstu1=newStudent('lilei',112);

借用构造函数继承

为了解决原型链继承中存在的问题,开发人员提供了一种新的技术:constructor stealing(借用构造函数、经典继承、伪造对象)

借用继承的做法非常简单,在子类型构造函数的内部调用父类型构造函数

  • 因为函数可以在任意时刻被调用
  • 因此通过apply()call()方法也可以在新创建的对象上执行构造函数
// 父类:公共属性和方法functionPerson(name,age,friends){// this = stuthis.name=name;this.age=age;this.friends=friends;}Person.prototype.eating=function(){console.log(this.name+" eating");}// 子类:特有属性和方法functionStudent(name,age,friends){this.sno=111;// 借用上面Person构造函数的执行过程Person.call(this,name,age,friends)}// 原型链继承varp=newPerson();Student.prototype=p;Student.prototype.studing=function(){console.log(this.name+" studying");}varstu1=newStudent('why',18,['lilei']);varstu2=newStudent('kobe',30,['james']);console.log(stu1);console.log(stu2);

弊端:

  • 1.Person函数至少被调用了两次
  • 2.stu原型对象上会多出来一些属性,这些属性是没有必要的
http://www.jsqmd.com/news/1145502/

相关文章:

  • 用 Codex + 跨境 Skill 做 Amazon 类目大盘分析
  • 从“不争”到共生:开源中国社区未来5年进化论
  • “CREAD: A Classification-Restoration Framework with Error Adaptive Discretization for Watch Time Pre
  • RJ45接口与网络变压器PCB设计:10个关键要点与3个常见EMC问题规避
  • ChatGPT分析Excel时,我常用的5种提问方式
  • ChatGPT生成Excel公式后,必须检查的5个地方
  • GD32F303VET6是一款耐高温的MCU
  • 内容多平台分发的传播放大效应分析
  • RAG学习总结2--向量数据库
  • AI文档翻译版面还原技术:从OCR到排版重建全解析
  • 2026实测:宁波3大暑假语文小升初机构横评
  • 黑箱API微调:基于进化策略的提示优化技术解析
  • 甘肃正规的民事案件律所哪家靠谱
  • 如何用Obsidian Local REST API彻底解放你的笔记自动化潜力
  • 小程序商城制作一个需要多少钱?2026全球5款AI/SAAS小程序商城制作工具推荐:餐宝盈/BBWEYY/比文云/Framer/NocoBase,含零代码SAAS、AI编程、源码定制交付
  • 配电站房环境监控系统:适配箱变环网,覆盖全类型配电场景
  • Java毕业设计-基于 SpringBoot + 微信小程序的线上租房平台的设计与实现 基于 SpringBoot 的房屋租赁小程序系统(源码+LW+部署文档+全bao+远程调试+代码讲解等)
  • KAB三甲平台:信息透明度与外汇行情信息呈现如何影响体验,给出一套方法
  • 通过API接口一键采购淘宝商品操作指南
  • 2025年中国第三方普惠智算云市场专题报告(华南篇)
  • 终极指南:构建专业级实时音频分析系统 [特殊字符]
  • 2026年月北京AI智能体软件定制开发头部企业综合实力测评报告
  • 商住楼项目施工组织设计与工程管理分析
  • 夏天给孩子喝“降火汤”?不如这瓶“中药汽水”,清热不伤脾
  • 没有域名怎么安装 SSL 证书?公网 IP 证书方案
  • 2026高端双叠自锁垫圈怎么选
  • AI算力基建动态简报(2026.07.07)
  • 中小企怎么做私域?诺云SCRM轻量化功能全解
  • BOKBO:面向K样本的VLA模型可验证拒判方法
  • 本地干货:南京组织效能培训收费与机构筛选指南