JavaScript面向对象的示例分析
发表于:2025-02-08 作者:千家信息网编辑
千家信息网最后更新 2025年02月08日,这篇文章主要介绍JavaScript面向对象的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JavaScript原型链每一个对象都有原型,指向另一个对象,另一个对象也有
千家信息网最后更新 2025年02月08日JavaScript面向对象的示例分析
这篇文章主要介绍JavaScript面向对象的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
JavaScript原型链
每一个对象都有原型,指向另一个对象,另一个对象也有自己的原型,就这样由原型的原型构成的链条就叫原型链。
原型链的尽头
如果一个原型链是,没用尽头的,那么在查找一原型链上不存在的属性时,就会一直查找下去,存在死循环了。显然不是这样的,那么原型链的尽头是什么?
Object的原型
顶层原型
看代码~
// obj字面量创建方法类似于 new Object()// 那么 obj对象就是Object的一个实例,也就是说obj.__proto__ === Object.prototypevar obj = { name: "fzb",};// 那么obj.__proto__ 或者 Oject.prototype 的__proto__ 是什么? 答案是: nullconsole.log(obj.__proto__); // [Object: null prototype] {}console.log(obj.__proto__.__proto__); // null
[Object: null prototype] {}
的特殊之处:
1、该对象存在原型属性,只是原型指向了null
,就是已经是顶层原型了。
2、该对象上还存在许多其他的方法,只是不可枚举,看不到。
创建Object对象的内存图
上方例子的内存图
Object是所有类的父类
原型链最顶层的原型对象就是Object的原型对象
例子:
function Student(sno, name) { this.sno = sno; this.name = name;}const stu = new Student(201801, "fzb");console.log(stu); // Student { sno: 201801, name: 'fzb' }console.log(stu.__proto__); // {}console.log(stu.__proto__.__proto__); // [Object: null prototype] {}console.log(Student.__proto__); // {}/* ***************后面将具体讲解注释内容*************** * 为什么不是 Student.__proto__ = [Object: null prototype] {} * 是因为 Student.__proto__ = Function.prototype * Function.prototype.__proto__ = Object.prototype = [Object: null prototype] {} * ***************后面将具体讲解注释内容*************** */console.log(Student.__proto__.__proto__); // [Object: null prototype] {}
内存图:
原型链实现继承
继承可以重复利用代码,子类可以使用
例子:
function Person() { this.name = "fzb";}Person.prototype.running = function () { console.log(this.name + "正在跑步~");};function Student(sno) { this.sno = sno;}Student.prototype = new Person();// 重写整个原型对象之后,要重新配置 constructorObject.defineProperty(Student.prototype, "constructor", { configurable: true, enumerable: false, writable: true, value: Student,});Student.prototype.studying = function () { console.log(this.name + "正在学习");};const stu = new Student(201801);stu.running(); // fzb正在跑步~stu.studying(); // fzb正在学习
内存图:
缺陷
1> 在打印子类对象时,有些属性本应该打印出来的,但是因为在父类上,无法打印出来。
2> 多个子类对象在进行某些操作时,会出现相互影响。
// 在上方例子上,加一点点代码,function Person() { this.name = "fzb"; this.friends = []; // 增加一个属性}const stu1 = new Student(201801);stu1.friends.push("zzw");const stu2 = new Student(201801);console.log(stu2.friends); // [ 'zzw' ]// stu2上取到了stu1的friends属性,这是不可以的
3> 无法传递参数,有些属性存在父类构造函数内,子类实例化时,初始化参数无法传入到父类。
借用构造函数实现继承
在子类构造函数内,调用构造函数。使改变父类构造函数内的this指向,然后父类在this上添加的属性就会在子类实例化的对象上。
function Person(name) { this.name = name; this.friends = [];}Person.prototype.running = function () { console.log(this.name + "正在跑步~");};function Student(sno, name) { Person.call(this, name); // 添加代码 this.sno = sno;}Student.prototype = new Person();// 重写整个原型对象之后,要重新配置 constructorObject.defineProperty(Student.prototype, "constructor", { configurable: true, enumerable: false, writable: true, value: Student,});Student.prototype.studying = function () { console.log(this.name + "正在学习");};const stu1 = new Student(201801,"stu1");stu1.friends.push("zzw");const stu2 = new Student(201802,"stu2");console.log(stu2.friends); // []
这时原型链实现继承的三个弊端,就解决的。但是又出现了新的缺陷。
缺陷
1> 父类构造函数至少执行了两次以上
2> 子类构造函数的原型对象是父类的实例对象,那么个对象上的属性将会是undefined
以上是"JavaScript面向对象的示例分析"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!
原型
对象
属性
函数
子类
正在
代码
例子
内存
内容
实例
就是
指向
缺陷
顶层
学习
示例
分析
参数
只是
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发体系ASPICE
成都地瓜网络技术
有实力的浪潮服务器哪个系列好
东莞盟大 软件开发怎么样
计算机网络技术涉及到
我家云停止超级硬盘后数据库
腾讯服务器转发策略在哪
数据库设计阶段的主要目标
铜陵金融软件开发公司
eplan连接官网数据库
云平台创建web服务器
企业培训软件开发费用
数据库下载流程
德阳App软件开发公司有几家
旅游集团网络安全分析
新乡云网互联网科技有限公司
金蝶数据库交换平台
新疆软件开发有限公司招聘
直销软件开发微信群
剑桥基因网络技术
mysql连接数据库的文件
磁盘清理软件开发
腾讯云服务器ip地址是固定的吗
网络技术室内设计
公安网络安全工作规范
重庆管理软件开发如何收费
化学工业生产必备数据库
网络安全CTFlogo
无线网出现网络安全问题
服务器随机传送