[[Prototype]]--浅析

你不知道的JavaScript------[prototype] new Foo(),创建并返回了一个新对象,这个新对象的[[prototype]]属性(在浏览器上显示为__proto__)的值是Foo的原型对象(Foo.prototype)new Foo()这个含糊调用实际上并没有直接创建关联,只是间接完成了我们的目标:关联到其他对象的新对象,做到这点更加直接的方式:Object.create(目标对象)调用new Foo()时,会创建a,其中一步就是将a内部的[[Prototype]]链接到Foo.prototype所指的对象。这一系列对象的链接被称为“原型链”。 阅读详情
1. [[Prototype]]

JavaScript中的对象有一个特殊的[[Prototype]]内置属性,其实就是对于其他对象的引用。几乎所有的对象在创建时[[Prototype]]属性都会被赋予一个而非空的值(可以为空,但很少见)。

[[Prototype]]引用有什么用呢?当我们试图引用对象的属性时会触发[[GET]]操作,比如myObject.a。对于默认的[[Get]]操作来说,第一步就是检查对象本身是否拥有一个a属性,如果有,就使用它。

如果默认的[[Get]]操作不能直接在对象上找到被请求的属性,那么会沿着对象的[[Prototype]]链 继续处理。

这个处理持续进行,直到找到名称匹配的属性,或者[[Prototype]]链终结。如果在链条的末尾都没有找到匹配的属性,那么[[Get]]操作的返回结果为undefined。

和这种[[Prototype]]链查询处理相似,如果你使用for..in循环迭代一个对象,所有在它的链条上可以到达的(并且是enumerable的)属性都会被枚举。如果你使用in操作符来测试一个属性在一个对象上的存在性,in将会检查对象的整个链条(无论属性是否可枚举性)。

var obj1 = {
    a: 2
};
var myObj = Objext.create(obj1);
for(var k in myObj) {
    console.log('found:' + k);   //found: a
}  
('a' in myObj); // true

当你以各种方式进行属性查询时,[[Prototype]]链就会一个链接一个链接地被查询。一旦找到属性或者链条终结,这种查询会就会停止。

2. Object.prototype

但是[[Prototype]]链到底在 哪里 “尽头”?

所有普通的[[Prototype]]链最终都会指向是内置的Object.prototype。这个对象包含各种在整个JS中被使用的通用方法,因为JavaScript中所有普通(内置的,而非被宿主环境扩展的)的对象都“衍生自”(也就是,使它们的[[Prototype]]顶端为)Object.prototype对象。

在这里发现一些熟悉的方法,比如toString()、valueOf()、hasOwnProperty(..)、isPrototypeOf(..)。

3. 设置与屏蔽属性

给一个对象那个设置属性并不仅仅是添加一个性能熟悉或者修改已有的属性。如:

var myObj.foo = 'bar';

如果属性名foo既存在于myObj额存在于myObj的[[Prototype]]链上层,就会发生屏蔽。直接存在于myObj上的foo属性会 屏蔽 原型链上层的所有的foo属性,因为myObj.foo总是会选择原型链中最底层的foo属性。

现在来分析当foo 不直接存在 于myObj,但 存在于myObj的原型链上层时会出现的3中情况:
1. 如果一个名为foo的普通数据访问属性存在于[[Prototype]]链上层,而且没有被标记为只读(writable:false),那么会直接在myObj上添加一个名为foo的新属性,它是屏蔽属性。
2. 如果一个foo存在于[[Prototype]]链的上层,但是它被标记为 只读(writable:false) ,那么无法修改已有属性或者在myObj上创建屏蔽属性。如果代码运行在strict mode下,会抛出一个错误。否则,这个设置属性值的操作会被无声地忽略。总之,没有发生遮蔽。
3. 如果在[[Prototype]]链上层存在foo,而且它是一个setter,那么就一定会调用这个setter。foo不会被添加到(也就是遮蔽在)myObject上,也不会重新定义foo这个setter。

如果你想在第二和第三种情况中遮蔽foo,那就不能使用 =操作符来赋值,而必须使用Object.defineProperty(..)将foo添加到myObject。

有时会发生隐式屏蔽, 如:

var obj = {
    a: 2;
};
var obj1 = Object.create(obj);
obj.a;   // 2
obj1.a;  // 2
obj.hasOwnProperty('a');  // true
obj1.hasOwnProperty('a');  // false
obj1.a++;  // 隐式屏蔽
obj.a;   // 2
obj1.a;  // 3
obj1.hasOwnProperty('a');  // true

虽然看起来obj1.a++应当是查询并递增obj.a属性,但是++操作符相当于obj1.a = obj1.a + 1。结果就是在[[Prototype]]上进行a的[[Get]]查询,从obj.a得到当前的值2,将这个值递增1,然后将值3用[[Put]]赋值到obj1中新建的的屏蔽属性a!

深入解析 JavaScript 中的 [[Prototype]] 和相关属性 的工作原理对于深入掌握 JavaScript 对象模型至关重要,它能帮助我们更好地理解对象继承、属性查找、原型链等关键概念,从而编写出更优雅、高效的 JavaScript 代码。原型链是 JavaScript 中属性查找机制的核心,当我们访问一个对象的属性或方法时,JavaScript 引擎会沿着原型链向上查找,直到找到该属性或方法,或者到达原型链的顶端。是 JavaScript 中一个隐藏的属性,它指向对象的原型对象,是 JavaScript 对象模型的核心概念,它决定了对象继承和属性查找机制。 阅读详情

相关推荐

SpringBoot Actuator未授权访问漏洞实战:从发现到利用

本文深入剖析了SpringBoot Actuator未授权访问漏洞的成因、危害与利用手法。文章详细演示了如何发现暴露的端点,并通过实战案例复现了从敏感信息泄露到利用反序列化漏洞实现远程代码执行(RCE)的全过程,为开发与运维人员提供了从漏洞发现到修复加固的完整安全指南。

weixin_29231221的博客 260

Js中prototype、[[prototype]]和__proto__的区别和用法

一.显式原型&隐式原型 显式原型:prototype 隐式原型:__proto__ 1.1 Important __proto__是每个对象都具有的属性 prototype是Function独有的属性 1.2 Tips 对象的隐式原型的值为其对应构造函数的显式原型的值 fn.__proto__ === Function.prototype 函数的prototype属性是定义...

qq_38722097的博客 1万+

用ST25DV芯片+KiCad快速设计NFC标签天线:参数计算/脚本生成/实测优化全流程

本文详细介绍了使用ST25DV芯片和KiCad工具设计NFC标签天线的全流程,包括参数计算、脚本生成和实测优化。通过解析芯片等效工作原理和设计思路,帮助开发者避开常见陷阱,实现高效、可量产的天线设计。文章还提供了Python计算工具和KiCad自动化脚本,大幅提升设计效率和成功率。

jj890的博客 758

prototype 和 [[Prototype]]之间的区别

prototype主要是指构造函数的一个属性,允许给所有由该构造函数创建的实例共享方法。是一个对象内部的隐式属性,表示对象实例的原型(即继承来源)。

qq_41413652的博客 780

EPLAN 设备接线图模板制作

属性摆放 设备连接图设置(选项 - - 设置) 连接图生成

weixin_36447711的博客 7864

LSS(Lift, Splat, Shoot)算法解析

**LSS(Lift, Splat, Shoot)** 是一个比较经典的自下而上的构建BEV特征的3D目标检测算法,通过将图像特征反投影到3D空间生成伪视锥点云,通过`Efficientnet`算法提取云点的深度特征和图像特征并对深度信息进行估计,最终将点云特征转换到BEV空间下进行特征融合和后续的语义分割任务。 本篇按照LSS代码的运行逻辑,结合论文对LSS算法进行解析。

超爱吃小蛋糕的66的博客 8685

在 Chrome 开发者工具的 sources 面板中看到的 [[prototype]]

是 JavaScript 中的一个基本概念,用于实现对象的继承机制。它通过指向另一个对象(即原型),形成一个链条,使得 JavaScript 对象能够继承和共享属性和方法。在实际编程中,理解和掌握原型链可以帮助我们编写更简洁、更高效的代码。利用 Chrome 开发者工具查看和调试对象的原型链,可以帮助我们更好地理解和应用这个抽象的概念。通过示例代码和真实案例的讲解,希望帮助大家更好地理解这一重要机制。请记住,在编写 JavaScript 代码时,虽然我们可以直接操作,但大多数情况下,我们更应该使用诸如。

孔乙己的博客 1175

安卓APP通过CH340实现USB串口通信与设备检测

本文详细介绍了安卓APP通过CH340芯片实现USB串口通信与设备检测的完整流程。从CH340芯片的基础原理到开发环境搭建,再到串口通信的具体实现和错误处理,提供了全面的技术指导。文章还分享了USB热插拔处理、自动重连策略以及性能优化等实战技巧,帮助开发者高效完成安卓与嵌入式设备的通信开发。

weixin_42531925的博客 380

关于js继承中“prototype模式“的constructor重定向浅析

文章转自:关于js继承中"prototype模式"的constructor重定向浅析_乱闯的java小屁孩的博客-优快云博客_js继承constructor 近来在看阮一峰的网络日志,确实写得好,非常通俗易懂,对我们这些小白受益匪浅! JavaScript的继承一直是一大难点,初涉会花费非常多的时间,我也如此。在摸索了许多天之后,逐渐有了一些头绪。 但是关于constructor属性重定向这个问题上,我还是存在疑问。 在测试过程中,发现测试的结果与阮一峰老师的结论有些出入,在此记录。 首先粘上阮

liubangbo的专栏 361

AI工具 | 每个打工人必备的15款人工智能超级工具

不过,还是有一些靠谱的人工智能平台,它们可不只是营销噱头。有些AI公司正试图改变游戏规则。人工智能工具让人们能够更聪明地工作,而不是更辛苦地劳作。如果你想知道未来有什么,那就来看看这10款人工智能工具吧,它们将彻底改变我们的工作方式。

Vampire_2017的博客 5万+

[VCS]门级仿真及SDF反标

摘要:门级仿真在STA工具普及后仍是验证的重要环节,主要用于检查SDC完备性、异步电路时序、网表完整性及为功耗分析提供波形。门级仿真分为不带时序反标的前仿和带SDF反标的后仿,后仿需加载SDF文件提供精确延时信息。VCS提供多种仿真选项控制时序检查行为,SDF反标可通过命令或系统函数实现。后仿需特别注意关闭notimingcheck选项以确保时序检查有效性,并建议检查SDF反标报告和波形验证延时一致性。

元直的博客 9792

javascript 之 prototype 浅析

prototype 原型 javascript 是一种 prototype based programming 的语言, 而与我们通常的 class based programming 有很大 的区别,我列举重要的几点如下: 1. 函数是first class object, 也就是说函数与对象具有相同的语言地位 2. 没有类,只有对象 3. 函数也是一种对象,所谓的函数对象 4. 对象...

weixin_30446197的博客 139

【深度学习新浪潮】ISP芯片算法技术简介及关键技术分析

ISP(Image Signal Processor)芯片作为现代影像系统的核心组件,负责对图像传感器输出的原始信号进行后期处理。ISP的主要功能包括线性纠正、噪声去除、坏点修复、色彩校正以及白平衡调整等,这些处理步骤对于提高图像质量和视觉效果至关重要。随着科技的进步,ISP芯片不仅提升了图像的清晰度和色彩准确性,还通过高效的算法增强了拍摄体验,尤其是在低光环境下的表现。

专注:太空算力、AI infra、异构调度、大模型成本工程 1223

浅析JavaScript的prototype

一、JavaScript对象的创建 (1)对象方法 function Student(name){ this.name=name; this.showName=function(){ alert("my name is "+this.name); }; ...

weixin_30412013的博客 110

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Prototype源码浅析——Function.prototype部分(二)

接着上一部分:Prototype源码浅析——Function.prototype部分(一) 粗略回顾,前面的 一个例子,两条道路: function handler(greet){ console.log(greet,this.name); } var obj = { name : 'xesam' } 第一、用call或者apply来改...

weixin_30908707的博客 232

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Prototype源码浅析——Function.prototype部分(一)

最近学习都是自己想到什么就些什么,这样进步也不明显,于是偶尔也看看Prototype的源码,分析分析也算笔记。 记得以前看jquery的源码的时候,网上一搜,源码分析一堆,不过透过表面看实质,大部分都只能算是注释。对于我这样的一个初学者,真算是坑爹啊。 于是到现在,jquery的源码还是只看了前面几百行。选择看Prototype的源码是因为Prototype与jqeury不一样,jquery的...

weixin_30655569的博客 163

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

浅析Object.prototype.toString方法

在JavaScript代码里,唯一可以访问该属性的方法就是通过 Object.prototype.toString ,通常方法如下: Object.prototype.toString.call(value) 在ECMAScript 5中,Object.prototype.toString()被调用时,会进行如下步骤: 1 如果 this是undefined ,返回 [object Undefined] ; 2 如果 this是null , 返回 [object Null] ; 3 令 O 为以 t

qingbaicai的博客 921

JS函数浅析之constructor、prototype属性

函数是JS里很神奇的一位童鞋。那么如何创建一个函数呢?简单来说有下面几种形式: 1、定义式 function a() {} 2、声明式 var a = function() {}; // 把一个匿名函数赋给一个变量 3、构造函数 var a = new Function(); // 用Function来实例化一个对象 函数有什么用呢?封装,重...

weixin_30328063的博客 78

浅析prototype、__protp__和constructor

文章目录前言new背后的原理`__proto__`属性分析作用Object.prototypeprototype属性分析作用prototype 如何产生修改一个对象的prototype会发生什么?constructor属性分析作用总结参考资料 前言 诶,人不努力,那又和大学生有什么区别呢?(别骂了别骂了) 相信很多像我这样的编程小白在入门js一段时间后,对JS中的prototype、__proto__与constructor这三个属性存在许多困惑。接下来我将分享一下我个人做的一些笔记。 其实说实话,这

SCUhzs 501

Prototype源码浅析

URL:http://www.cnblogs.com/xesam/category/348809.html(超强)  

javaSamBlog 131

[原]浅析Javascript中继承和Prototype的关系

JavaScript中支持类的定义,而且定义的方式与函数基本上也相同。 1functionout(val){2document.write(val+"<br>");3};45functionBaseClass(){6this.a="I'mBaseClass.a.";7}; 第一行的内容可以看成是一个函数,第五行可以看成是一个类。 我们继续,现在我...

weixin_34212189的博客 158

浅析 JavaScript 中的 Function.prototype.bind() 方法

Function.prototype.bind()方法 bind()方法的主要作用就是将函数绑定至某个对象,bind()方法会创建一个函数,函数体内this对象的值会被绑定到传入bind()函数的值。 例如,在f()函数上调用bind()方法并传入参数obj,即f.bind(obj),这将返回一个新函数, 新函数会把原始的函数f()当做obj的方法来调用...

aoyou3037的博客 191
上一篇: this--浅析
下一篇: 三栏布局的多种实现
林雨静
博客等级 码龄10年 11粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值