【JavaScript】原型与原型链
1、函数的 prototype 属性(显性原型)
- 每个函数都有一个 prototype 属性,指向原型对象(是一个空对象,空对象的意思是没有添加的其他属性)
- 原型对象有一个属性 constructor 指向函数对象
2、实例对象的__proto__属性(隐性原型)
- 每个实例对象都一个__proto__属性,指向原型对象(和其构造函数的 prototype 属性一样,既
prototype===__proto__
3、显性原型和隐性原型的使用
function Fn(){}//定义一个函数 Fn()
Fn.prototype.test = function(){}//往函数 Fn 的原型对象上添加一个函数 test()
var fn = new Fn();//创建一个函数 Fn() 的实例对象 fn
fn.test();//fn 可以调用之前添加在函数 Fn 原型对象上的函数 test()
4、原型链(别名:隐性原型连)
访问一个属性的顺序:
- 首先在自身属性上查找,找到返回
- 自身属性上没有,沿着__proto__往下查找,找到返回
- 最终没有找到,则返回 undefined
ps:a.test 是调用属性,a.test() 是调用方法。没有找到时返回的也不一样,前者返回 undefined ,后者报错 not a function
原型链的特点:
- 函数的显示原型指向对象默认是个空 Object 实例对象(但是 Object 不满足,它指向的是 null,是原型链的尽头 )
- 所有的函数都是 Function 的实例对象(包括 Function),所以每个函数的__proto__都是相同的
总关系图
5、原型链的缺点
- 当有多个实例对象时,其中一个实例对象通过原型链修改了属性,其他的实例对象获得的属性值也会修改
- 无法通过往父类传参
标签:
JavaScript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了