![javascript|[[Prototype]] ——原型链两万字全面解析「建议收藏」](http://img88.jing111.com/img.php?https://image.uc.cn/s/wemedia/s/upload/2022/16177b05655fef11e18af8a88ffec1ab.png)
文章图片
[[Prototype
JavaScript 中几乎所有属性都有一个 [[Prototype
内置属性 , 其实就是一个对于其他对象的引用 。 几乎所有的对象都在创建时 [[Prototype
属性都会被赋予一个非空的值 。
注意:我们很快就可以看到 , 对象的 [[Prototype
JavaScript 中所有的对象都存在一个 [[Prototype
属性 , 而且它的 [[Prototype
是非空的 。
链接可以为空 , 虽然很少见 。
思考下面的代码:
[[Prototype
一般是不为空的 , 但是可以人工的置为空 。
var myObj = {
a: 2
myObj.a // 2[[Prototype
这段代码通过字面量的方式定义了一个对象 , 然后访问到了这个对象的属性 。 作者在这里拿出这个例子来 , 是想说明一般是不会访问到 [[Prototype
属性的 。
引用有什么用呢?我们以前说过 , 当你试图访问一个对象的属性的时候会触发 [[Get
操作 , 比如 myObj.a 。 对于默认的 [[Get
操作来说 , 第一步是检查对象本身是否具有这个属性 , 如果有的话就使用它 。
但是如果 a 不在 myObj 中 , 就需要使用对象的 [[Prototype
这里的知识点是关于访问对象属性的时候 , 会触发对象的 [[Get
操作 , 这个方法是隐藏的 。
链了 。
对于默认的 [[Get
操作来说 , 如果无法在对象本身找到需要的属性 , 就会继续访问对象的 [[Prototype
链 。
这里提到了 [[Prototype
链 , 以及查找对象属性的方式 , 当对象本身并不具有某个属性的时候 , 就开始在 [[Prototype
链上查找 。
var anotherObj = {
a: 2
var myObj = Object.create( anotherObj )
myObj.a //2稍后我们会介绍 Object.create 的原理 , 现在只需要知道它会创建一个对象并把这个对象的 [[Prototype
关联到指定对象上 。
现在 myObj 对象的 [[Prototype
这段代码通过关联原型的方式 , 来进行属性的访问 , 可以看到 myObj 并没有指定任何属性 , 此时 a 属性是访问的原型链上的 anotherObj 的 a 属性 。
关联到 anotherObject 。 显然 myObj.a 并不存在 , 但是尽管如此 , 属性访问仍然成功地找到了值 2 。
但是 , 如果 anotherObj 中什么也不到 a 并且 [[Prototype
链不为空的话 , 就会继续查找下去 。
这个过程会持续找到匹配的属性名或者查找完整条 [[Prototype
链 。 如果是后者的话 ,[[Get
操作的返回值是 undefined 。
使用 for in 遍历对象时原理和查找 [[Prototype
链类似 , 任何通过原型链访问到的属性都会被枚举 。 使用 in 操作符来检查属性在对象中是否存在时 , 同样会查找对象整条原型链 , 无论属性是否可枚举 。
in 操作符作用于整条原型链 。 并且原型链的查找会在找到时就停止 , 找不到的话就持续到原型链的最后一层 。
in 操作符用来确定当前字符串的属性名是否存在于指定对象的原型链条上 。
var anotherObj = {
a: 2
b: 2
var myObj = Object.create( anotherObj )
- javascript|穿戴设备将迎变革,OPPO又增新专利,能提升模式切换效率!
- |强劲送风,满足你对美感的挑剔—洛斐有范S桌面风扇
- 你甩不掉的伴侣——AEROPEXAS800初体验
- 趋势雷达|行业流行力——《新锐美妆种草看点》
- 社交平台cookie出卖了你——木马FFdroider欲窃取你的账户信息丨大东话安全
- 电子商务|广州蓝景分享 — 给刚入职前端\大佬\们的一些建议
- 开源软件|嵌入式开发:技巧和窍门——引导加载程序跳转到应用程序代码
- 三星|三星 S22 Ultra——硬件上的机皇,系统体验两极分化
- 天津航空——打造主题飞机 为智能大会插上“双翼”
- 支付宝|嵌入式开发:嵌入式基础——重启和重置的区别
