JavaScript 原型链运行原理

JavaScript原型链详解:从设计原理到补环境实战 面向对象编程中,代码复用是核心诉求。JavaScript采用原型链机制实现继承,通过prototype、__proto__与constructor三个核心属性构建对象间的关联。理解属性查找、instanceof判断等运行原理,不仅是解决继承和兼容问题的基础,也是进行原型链补环境、编写polyfill等工程实践的关键。本文从设计初衷出发,结合实际代码梳理三角关系与常见陷阱,并展示在框架开发和环境模拟中的典型应用。 阅读详情

原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好。

不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么。简单粗暴点看原型链吧,想点与代码无关的事,比如人、妖以及人妖。

1)人是人他妈生的,妖是妖他妈生的。人和妖都是对象实例,而人他妈和妖他妈就是原型。原型也是对象,叫原型对象。

这里写图片描述

2)人他妈和人他爸啪啪啪能生出一堆人宝宝、妖他妈和妖他爸啪啪啪能生出一堆妖宝宝,啪啪啪就是构造函数,俗称造人。

这里写图片描述

3)人他妈会记录啪啪啪的信息,所以可以通过人他妈找到啪啪啪的信息,也就是说能通过原型对象找到构造函数。

4)人他妈可以生很多宝宝,但这些宝宝只有一个妈妈,这就是原型的唯一性。

5)人他妈也是由人他妈他妈生的,通过人他妈找到人他妈他妈,再通过人他妈他妈找到人他妈他妈……,这个关系叫做原型链。这里写图片描述

6)原型链并不是无限的,当你通过人他妈一直往上找,最后发现你会发现人他妈他妈他妈……的他妈都不是人,也就是原型链最终指向null。

7)人他妈生的人会有人的样子,妖他妈生的妖会有妖的丑陋,这叫继承。

这里写图片描述

8)你继承了你妈的肤色,你妈继承了你妈他妈的肤色,你妈他妈……,这就是原型链的继承。

9)你谈对象了,她妈让你带上房产证去提货,你若没有,那她妈会问你妈有没有,你妈没有那她妈会问你妈她妈有没有……这就是原型链的向上搜索。

10)你会继承你妈的样子,但是你也可以去染发洗剪吹,就是说对象的属性可以自定义,会覆盖继承得到的属性。

这里写图片描述

11)虽然你洗剪吹了染成黄毛了,但你不能改变你妈的样子,你妈生的弟弟妹妹跟你的黄毛洗剪吹没一点关系,就是说对象实例不能改动原型的属性。

12)但是你家被你玩火烧了的话,那就是说你家你妈家你弟们家都被烧了,这就是原型属性的共享。

13)你妈外号阿珍,邻居大娘都叫你阿珍儿,但你妈头发从飘柔做成了金毛狮王后,隔壁大婶都改口叫你包租仔,这叫原型的动态性。
这里写图片描述

14)你妈爱美,又跑到韩国整形,整到你妈他妈都认不出来,即使你妈头发换回飘柔了,但隔壁邻居还是叫你金毛狮王子。因为没人认出你妈,整形后的你妈已经回炉再造了,这就是原型的整体重写。
这里写图片描述

尼玛!你特么也是够了! Don’t BB! Show me the code!

function Person (name) { this.name = name; }
function Mother () { }
Mother.prototype = {    //Mother的原型
    age: 18,
    home: ['Beijing', 'Shanghai']
};
Person.prototype = new Mother(); //Person的原型为Mother

//用chrome调试工具查看,提供了__proto__接口查看原型,这里有两层原型,各位还是直接看chrome好一点。
var p1 = new Person('Jack'); //p1:'Jack'; __proto__:{__proto__:18,['Beijing','Shanghai']}
var p2 = new Person('Mark'); //p2:'Mark'; __proto__:{__proto__:18,['Beijing','Shanghai']}

p1.age = 20; 

/* 实例不能改变原型的基本值属性,正如你洗剪吹染黄毛跟你妈无关

 * 在p1实例下增加一个age属性的普通操作,与原型无关。跟var o={}; o.age=20一样。
 * p1:下面多了个属性age,而__proto__跟 Mother.prototype一样,age=18。
 * p2:只有属性name,__proto__跟 Mother.prototype一样
 */

p1.home[0] = 'Shenzhen'; 

/* 原型中引用类型属性的共享,正如你烧了你家,就是烧了你全家的家

  • 这个先过,下文再仔细唠叨一下可好?
* p1:'Jack',20; __proto__:{__proto__:18,['Shenzhen','Shanghai']}
 * p2:'Mark';    __proto__:{__proto__:18,['Shenzhen','Shanghai']}
 */

p1.home = ['Hangzhou', 'Guangzhou']; 
/* 其实跟p1.age=20一样的操作。换成这个理解: var o={}; o.home=['big','house']
 * p1:'Jack',20,['Hangzhou','Guangzhou']; __proto__:{__proto__:18,['Shenzhen','Shanghai']}
 * p2:'Mark';                             __proto__:{__proto__:18,['Shenzhen','Shanghai']}
 */

delete p1.age;    

/* 删除实例的属性之后,原本被覆盖的原型值就重见天日了。正如你剃了光头,遗传的迷人小卷发就长出来了。

这就是向上搜索机制,先搜你,然后你妈,再你妈他妈,所以你妈的改动会动态影响你。

 * p1:'Jack',['Hangzhou','Guangzhou'];
 *  __proto__:{__proto__:18,['Shenzhen','Shanghai']}
 * p2:'Mark';                         
 *  __proto__:{__proto__:18,['Shenzhen','Shanghai']}
 */
Person.prototype.lastName = 'Jin'; 

/* 改写原型,动态反应到实例中。正如你妈变新潮了,邻居提起你都说你妈真潮。

  • 注意,这里我们改写的是Person的原型,就是往Mother里加一个lastName属性,等同于Mother.lastName=‘Jin’
  • 这里并不是改Mother.prototype,改动不同的层次,效果往往会有很大的差异。
 * p1:'Jack',['Hangzhou','Guangzhou']; __proto__:{'jin',__proto__:18,['Shenzhen','Shanghai']}
 * p2:'Mark';                          __proto__:{'jin',__proto__:18,['Shenzhen','Shanghai']}
 */

Person.prototype = { 
    age: 28, 
    address: { country: 'USA', city: 'Washington' }
};
var p3 = new Person('Obama'); 

/* 重写原型!这个时候Person的原型已经完全变成一个新的对象了,也就是说Person换了个妈,叫后妈。

换成这样理解:var a=10; b=a; a=20; c=a。所以b不变,变得是c,所以p3跟着后妈变化,与亲妈无关。

 * p1:'Jack',['Hangzhou','Guangzhou']; __proto__:{'jin',__proto__:18,['Shenzhen','Shanghai']}
 * p2:'Mark';                          __proto__:{'jin',__proto__:18,['Shenzhen','Shanghai']}
 * p3:'Obama';__proto__: 28 {country: 'USA', city: 'Washington'}
 */
 Mother.prototype.no = 9527;

/* 改写原型的原型,动态反应到实例中。正如你妈他妈变新潮了,邻居提起你都说你丫外婆真潮。

  • 注意,这里我们改写的是Mother.prototype,p1p2会变,但上面p3跟亲妈已经了无瓜葛了,不影响他。
 * p1:'Jack',['Hangzhou','Guangzhou']; __proto__:{'jin',__proto__:18,['Shenzhen','Shanghai'],9527}
 * p2:'Mark';                          __proto__:{'jin',__proto__:18,['Shenzhen','Shanghai'],9527}
 * p3:'Obama';__proto__: 28 {country: 'USA', city: 'Washington'}
 */

Mother.prototype = { 
    car: 2, 
    hobby: ['run','walk']
};
var p4 = new Person('Tony');

/* 重写原型的原型!这个时候Mother的原型已经完全变成一个新的对象了!人他妈换了个后妈!

  • 由于上面Person与Mother已经断开联系了,这时候Mother怎么变已经不影响Person了。
 * p4:'Tony';__proto__: 28 {country: 'USA', city: 'Washington'}
 */
 
Person.prototype = new Mother(); //再次绑定
var p5 = new Person('Luffy');

// 这个时候如果需要应用这些改动的话,那就要重新将Person的原型绑到mother上了
// p5:‘Luffy’;proto:{proto: 2, [‘run’,‘walk’]}

p1.proto.proto.proto.proto //null,你说原型链的终点不是null?
Mother.proto.proto.proto //null,你说原型链的终点不是null?

看完基本能理解了吧?

现在再来说说 p1.age = 20、p1.home = [‘Hangzhou’, ‘Guangzhou’] 和  p1.home[0] = ‘Shenzhen’ 的区别。 p1.home[0] = ‘Shenzhen’;  总结一下是 p1.object.method,p1.object.property 这样的形式。

p1.age = 20;  p1.home = [‘Hangzhou’, ‘Guangzhou’];这两句还是比较好理解的,先忘掉原型吧,想想我们是怎么为一个普通对象增加属性的:

var obj = new Object();
obj.name='xxx';
obj.num = [100, 200];

这样是不是就理解了呢?一样一样的呀。

那为什么 p1.home[0] = ‘Shenzhen’ 不会在 p1 下创建一个 home 数组属性,然后将其首位设为 ‘Shenzhen’呢?

我们还是先忘了这个,想想上面的obj对象,如果写成这样: var obj.name = ‘xxx’, obj.num = [100, 200],能得到你要的结果吗? 显然,除了报错你什么都得不到。因为obj还未定义,又怎么能往里面加入东西呢?

同理,p1.home[0]中的 home 在 p1 下并未被定义,所以也不能直接一步定义 home[0] 了。如果要在p1下创建一个 home 数组,当然是这么写了:

p1.home = [];
p1.home[0] = 'Shenzhen';

这不就是我们最常用的办法吗?

而之所以 p1.home[0] = ‘Shenzhen’ 不直接报错,是因为在原型链中有一个搜索机制。当我们输入 p1.object 的时候,原型链的搜索机制是先在实例中搜索相应的值,找不到就在原型中找,还找不到就再往上一级原型中搜索……一直到了原型链的终点,就是到null还没找到的话,就返回一个 undefined。

当我们输入 p1.home[0] 的时候,也是同样的搜索机制,先搜索 p1 看有没有名为 home 的属性和方法,然后逐级向上查找。最后我们在Mother的原型里面找到了,所以修改他就相当于修改了 Mother 的原型啊。

一句话概括:p1.home[0] = ‘Shenzhen’ 等同于 Mother.prototype.home[0] = ‘Shenzhen’。

由上面的分析可以知道,原型链继承的主要问题在于属性的共享,很多时候我们只想共享方法而并不想要共享属性,理想中每个实例应该有独立的属性。因此,原型继承就有了下面的两种改良方式:

1)组合继承

function Mother (age) {
    this.age = age;
    this.hobby = ['running','football']
}
Mother.prototype.showAge = function () {
    console.log(this.age);
};
 
function Person (name, age) {
    Mother.call(this, age);  //第二次执行
    this.name = name;
}
Person.prototype = new Mother();  //第一次执行
Person.prototype.constructor = Person;
Person.prototype.showName = function () {
    console.log(this.name);
}
 
var p1 = new Person('Jack', 20);
p1.hobby.push('basketball');  //p1:'Jack'; __proto__:20,['running','football']
var p2 = new Person('Mark', 18);  //p2:'Mark'; __proto__:18,['running','football']

结果是酱紫的:

这里写图片描述

这里写图片描述

这里第一次执行的时候,得到 Person.prototype.age = undefined, Person.prototype.hobby = [‘running’,’football’],第二次执行也就是 var p1 = new Person(‘Jack’, 20) 的时候,得到 p1.age =20, p1.hobby = [‘running’,’football’],push后就变成了 p1.hobby = [‘running’,’football’, ‘basketball’]。

其实分辨好 this 的变化,理解起来也是比较简单的,把 this 简单替换一下就能得到这个结果了。 如果感觉理解起来比较绕的话,试着把脑子里面的概念扔掉吧,把自己当浏览器从上到下执行一遍代码,结果是不是就出来了呢?

通过第二次执行原型的构造函数 Mother(),我们在对象实例中复制了一份原型的属性,这样就做到了与原型属性的分离独立。细心的你会发现,我们第一次调用 Mother(),好像什么用都没有呢,能不调用他吗?可以,就有了下面的寄生组合式继承。

2)寄生组合式继承

function object(o){
    function F(){}
    F.prototype = o;
    return new F();
}
 
function inheritPrototype(Person, Mother){
    var prototype = object(Mother.prototype);
    prototype.constructor = Person;    
    Person.prototype = prototype;    
}
                        
function Mother (age) {
    this.age = age;
    this.hobby = ['running','football']
}
Mother.prototype.showAge = function () {
    console.log(this.age);
};
 
function Person (name, age) {
    Mother.call(this, age);
    this.name = name;
}
 
inheritPrototype(Person, Mother);
 
Person.prototype.showName = function () {
    console.log(this.name);
}
 
var p1 = new Person('Jack', 20);
p1.hobby.push('basketball');//p1:'Jack'; __proto__:20,['running','football']
var p2 = new Person('Mark', 18); //p2:'Mark'; __proto__:18,['running','football']

结果是酱紫的:
这里写图片描述

这里写图片描述

原型中不再有 age 和 hobby 属性了,只有两个方法,正是我们想要的结果!

关键点在于 object(o) 里面,这里借用了一个临时对象来巧妙避免了调用new Mother(),然后将原型为 o 的新对象实例返回,从而完成了原型链的设置。很绕,对吧,那是因为我们不能直接设置 Person.prototype = Mother.prototype 啊。

小结

说了这么多,其实核心只有一个:属性共享和独立的控制,当你的对象实例需要独立的属性,所有做法的本质都是在对象实例里面创建属性。
若不考虑太多,你大可以在Person里面直接定义你所需要独立的属性来覆盖掉原型的属性。总之,使用原型继承的时候,要对于原型中的属性要特别注意,因为他们都是牵一发而动全身的存在。

下面简单罗列下js中创建对象的各种方法,现在最常用的方法是组合模式,熟悉的同学可以跳过到文章末尾点赞了。

1)原始模式(对象字面量方式)

var person = {
    name: 'Jack',
    age: 18,
    sayName: function () { alert(this.name); }
};

Object构造函数方式


var person = new Object();
person.name = 'Jack';
person.age = 18;
person.sayName = function () {
    alert(this.name);
};

显然,当我们要创建批量的person1、person2……时,每次都要敲很多代码,资深copypaster都吃不消!然后就有了批量生产的工厂模式。

2)工厂模式(定义一个函数创建对象)

function creatPerson (name, age) {
    var person = new Object();
    person.name = name;
    person.age = age;
    person.sayName = function () {
        alert(this.name);
    };
    return person;
}

工厂模式就是批量化生产,简单调用就可以进入造人模式(啪啪啪……)。指定姓名年龄就可以造一堆小宝宝啦,解放双手。
但是由于是工厂暗箱操作的,所以你不能识别这个对象到底是什么类型、是人还是狗傻傻分不清(instanceof 测试为 Object),另外每次造人时都要创建一个独立的temp对象,代码臃肿,雅蠛蝶啊。

3)构造函数模式:为对象定义一个构造函数

function Person (name, age) {
    this.name = name;
    this.age = age;
    this.sayName = function () {
        alert(this.name);
    };    
}
var p1 = new Person('Jack', 18); //创建一个p1对象
Person('Jack', 18);    //属性方法都给window对象,window.name='Jack',window.sayName()会输出Jack

构造函数与C++、JAVA中类的构造函数类似,易于理解,另外Person可以作为类型识别(instanceof 测试为 Person 、Object)。但是所有实例依然是独立的,不同实例的方法其实是不同的函数。

这里把函数两个字忘了吧,把sayName当做一个对象就好理解了,就是说张三的 sayName 和李四的 sayName是不同的存在,但显然我们期望的是共用一个 sayName 以节省内存。

4)原型模式 (直接定义prototype属性)

function Person () {}
Person.prototype.name = 'Jack';
Person.prototype.age = 18;
Person.prototype.sayName = function () { alert(this.name); };
//4.原型模式,字面量定义方式
function Person () {}
Person.prototype = {
    name: 'Jack',
    age: 18,
    sayName: function () { alert(this.name); }
};
var p1 = new Person(); //name='Jack'
var p2 = new Person(); //name='Jack'

这里需要注意的是原型属性和方法的共享,即所有实例中都只是引用原型中的属性方法,任何一个地方产生的改动会引起其他实例的变化。

5)混合模式(构造+原型;)原型构造组合模式

function Person (name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype = {
    hobby: ['running','football'];
    sayName: function () { alert(this.name); },
    sayAge: function () { alert(this.age); }
};
var p1 = new Person('Jack', 20);
//p1:'Jack',20; __proto__: ['running','football'],sayName,sayAge
var p2 = new Person('Mark', 18);
//p1:'Mark',18;__proto__: ['running','football'],sayName,sayAge

做法是将需要独立的属性方法放入构造函数中,而可以共享的部分则放入原型中,这样做可以最大限度节省内存而又保留对象实例的独立性。

JavaScript原型链本质:从Object.create到class的运行机制 JavaScript中‘一切皆对象’并非口号,而是其运行时的核心范式——每个对象都通过内部[[Prototype]]链接到另一个对象,构成查找属性与方法的原型链。该机制决定了this绑定、instanceof判断、继承实现及响应式系统底层行为。理解Object.create()如何显式设置原型、constructor为何关键、__proto__与Object.getPrototypeOf()的差异,是掌握Vue 3 reactive、Promise链式调用、甚至内存泄漏排查的基础。本文聚焦原型链的构建、遍历 阅读详情

相关推荐

js原型链污染

JavaScript 原型链是实现继承的一种方式,每个对象都有一个内部属性(在代码中可通过__proto__访问),它指向该对象的原型对象。当访问一个对象的属性或方法时,JavaScript 首先会在该对象本身查找,如果找不到,就会沿着原型链向上查找,直到找到该属性或方法,或者到达原型链的末尾(传统的面向对象(例如java),采用类的形式,以类为模版创建对象JavaScript 是基于原型链实现继承和封装。

ziworld_的博客 697

【JavaScript】js中的原型继承

js中的原型继承

南栀的博客 3705

SVG文件上传漏洞实战:从XSS攻击到防御策略

本文深入剖析了SVG文件上传漏洞的成因与危害,揭示了攻击者如何利用SVG的XML本质构造恶意文件,绕过常规检查实现存储型XSS攻击。文章通过实战复现演示了完整的攻击链,并提供了从严格内容检查、安全解析过滤到设置CSP策略等多层次的纵深防御方案,帮助开发者从根本上加固文件上传功能。

weixin_29230805的博客 395

js原型继承

这是一道非常经典的前端面试题,尤其是对于初中级前端来说,基本上是必考题。

qq_38217940的博客 4567

Windows+VSCode+Cline+MCP全流程配置指南

本文提供了一份详细的Windows+VSCode+Cline+MCP全流程配置指南,旨在帮助开发者打造高效的AI辅助编码工作站。文章从环境准备讲起,逐步指导安装VSCode、配置Cline插件、搭建Node.js环境,并重点详解如何通过MCP为Cline集成文件系统和GitHub等工具服务器,实现用自然语言操控开发环境,从而显著提升日常编码与文件管理效率。

weixin_28840143的博客 550

Full Range && Limit Range

Full Range && Limit Range1 Full range和Limit Range定义2 为什么会需要Limit Range3 用Full range去显示limit Range图片4 YUV转RGB5 额外 1 Full range和Limit Range定义 我们知道,对于RGB和YUV的色彩空间来说,有个位深(bit-depth)的概念;位深是指记录图像每个像素的色彩通道时所使用的bit数,常见的RGB888,YUV420-8bit。以RGB888为例,其代表R G B

zjhcj1的博客 1万+

简单粗暴地理解js原型链--js面向对象编程

原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好。 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么。简单粗暴点看原型链吧,想点与代码无关的事,比如人、妖以及人妖。 1)人是人他妈生的,妖是妖他妈生的。人和妖都是对象实例,而人他妈和妖他妈就是原型。原型也是对象,叫原型对象。 2)人他妈和人他爸啪啪啪能生...

weixin_30421525的博客 363

从0到1搭建StarRocks3.4.1存算一体架构(VM 虚拟机版)

本文详细介绍了如何在VM虚拟机上从零搭建StarRocks 3.4.1存算一体架构。首先阐述了StarRocks作为高性能分布式SQL数据仓库的优势,重点讲解了其存算一体架构的设计原理。随后提供完整的安装指南,包括环境准备(3台CentOS 8虚拟机配置)、网络互通验证、Java环境配置、软件包解压安装等关键步骤。文章特别详细说明了FE和BE节点的配置文件修改(fe.conf和be.conf)以及必要的防火墙端口开放配置。通过图文并茂的方式,帮助开发者和运维人员快速掌握StarRocks集群部署方法,为后续

小 tom的博客 1327

JavaScript对象及原型链

JavaScript对象及原型链 一、JS对象 1、对象定义 js对象是引用类型,用于存储键值对 2、对象创建 (1)直接量(字面量):适用于创建单个对象,当要创建多个对象会产生大量重复代码; var person = { name:'Tom', age:20, } console.log(person.age);//20 (2)工厂模式:使用函数创建,一般也少用: function createPerson1(name,age){ var obj = new Object(); obj.name

偷只猫来养的博客 414

CMOS传输门(互补开关)实战指南 | 设计优化 + 常见问题解析

本文深入解析CMOS传输门(互补开关)的设计优化与常见问题,涵盖导通特性、版图设计、高频应用及混合信号设计等关键领域。通过实测数据和优化技巧,帮助工程师解决衬底连接、信号完整性等实际问题,提升数字和模拟混合信号设计的效率与可靠性。

weixin_29229989的博客 161

matlab数学建模练习(2)练习电子科技大学数学实验

【代码】matlab数学建模练习(2)练习电子科技大学数学实验。

c_wrj_的博客 1435

【JavaScript】原型继承详解

在面向对象编程中,继承是一个对象可以从另一个对象获得属性和方法的机制。JavaScript 使用原型继承而非类继承,每个对象都有一个隐式关联的原型对象(通过__proto__引用),并且可以访问该原型对象的属性和方法。构造函数是 JavaScript 中用于创建对象的函数。通过使用new关键字,可以调用构造函数并创建新的对象实例。每个构造函数都会自动拥有一个prototype属性,指向一个包含所有实例共享属性和方法的对象。// 输出:Dog在这个例子中,Animal是一个构造函数,dog是。

lph159的博客 2049

点云处理实操(四) -PCL中的点云三角化

点云处理实操(四) -PCL中的点云三角化

cangqiongxiaoye的博客 939

对JS原型链的简单理解

(一)原型 1.每个函数(通常指构造函数),都有一个属性prototype,就是显示原型 2.prototype的值是一个对象,包含constructor和__proto__两个属性 3.constructor指向构造函数本身,__proto__指向自己构造函数的显示原型 4.添加在显示原型上的方法和属性,被new出来的实例对象共享 (二)原型链 1.构造函数prototype的__proto__属性,指向自己的构造函数Object的prototype 2.Object的prototype的__proto

weixin_45806343的博客 206

DeepFashion 服装识别:基于 YOLOv10 的深度学习实现与 UI 界面开发

随着深度学习的发展,目标检测算法在服装识别任务中表现出色,特别是 YOLO(You Only Look Once)系列模型。服装识别(Fashion Recognition)是计算机视觉领域的重要任务,广泛应用于。已提供,可用于服装分类、款式识别、虚拟试衣等应用。训练服装识别模型,并开发。

YOLO 802

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

JavaScript学习笔记:对象合并、原型链与运行时报错实战解析

JavaScript作为Web开发的核心语言,入门简单但深入困难,其难点往往集中在对象操作、函数机制与原型链等基础概念上。对象合并是业务开发中的高频操作,理解浅拷贝与深拷贝的区别,才能避免嵌套引用带来的数据污染。函数调用方式决定了this指向,而原型链机制则揭示了对象属性查找的底层逻辑,掌握这些原理,是解决运行时错误的前提。面对常见的TypeError、ReferenceError等报错,学会阅读错误堆栈、实施分层捕获策略,能够显著提升调试效率。这些技术能力广泛应用于表单处理、DOM交互乃至移动端混合开发场

weixin_42641998的博客 223

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Node.js原型链污染漏洞:原理、利用与防御实战指南

在JavaScript和Node.js开发中,对象与原型链是核心语言特性,构成了其独特的继承机制。每个对象都通过原型链关联到一个原型对象,属性查找会沿着这条链向上追溯。这一机制虽然灵活,但也引入了安全风险:当代码对用户输入的对象进行不安全的深度合并或属性拷贝时,若未过滤`__proto__`、`constructor`等特殊键名,攻击者可能篡改全局对象的原型,从而污染所有继承自该原型的对象,这就是原型链污染漏洞。其技术价值在于揭示了语言底层特性可能被滥用于攻击,威胁应用基础安全。该漏洞常出现在对象合并、配置

weixin_30808693的博客 329

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

JavaScript 原型链:面向对象编程的核心机制

构造函数:用于创建对象的模板原型对象:存放共享属性和方法实例对象:通过new关键字创建使用class语法糖简化继承用替代new实现纯净继承探索new运算符的底层实现研究 V8 引擎的隐藏类优化机制对比原型链与作用域链的异同优先选择组合模式而非深度原型链继承。

BANaanaa的博客 622

js原型链

原型链 test 对象从 Bar.prototype 和 Foo.prototype 继承下来;因此,它能访问 Foo 的原型方法 method。同时,它也能够访问那个定义在原型上的 Foo 实例属性 value。需要注意的是 new Bar() 不会创造出一个新的 Foo 实例,而是重复使用它原型上的那个实例;因此,所有的 Bar 实例都会共享相同的 value 属性。 function F...

miss_kiss的专栏 135

js 的原型链

从别的博客粘过来的,做个备忘录,以后好查。原型链(Prototype chain)Javacript 是一门高度抽象的面向对象(object-oriented)语言, 它没有类的概念,但是,重用[reuse]这个理念没什么不同(某些方面,甚至比class-更加灵活),可以由prototype chain原型链来实现。var a = { x: 10, calculate: function (

wangchen2009hao的博客 368

js中的作用域和原型链

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34255793的博客 78

JavaScript原型链深度剖析

在JavaScript的世界中,原型链(Prototype Chain)是一个核心概念,它决定了对象如何继承属性和方法。对于初学者来说,理解原型链可能是个挑战,但一旦掌握了它,就能更好地利用JavaScript的动态性和灵活性。本篇文章将详细探讨JavaScript的原型链,帮助大家深入理解其工作原理。

aike13ky的博客 3021

JavaScript原型链

1.原型链 1.1 原型链解释: (概念) 原型链指一些原型通过__proto__指针构成的链表,一个原型链可以为想共享原型链中数据的对象服务,用于实现JavaScript中的继承机制。 (原型链指针) 原型链中涉及到的指针: 每个对象都有一个__proto__指针来访问对象的原型 每个原型都是一个用于实现继承的对象,除了有__proto__指针之外,还有constructor指针指向构造函数 每个函数都是一个对象,除了有__proto__指针之外,还有prototype指针指向与之关联的原型对象

qq_37464878的博客 6692

JS原型链

原型:被用于复制现有实例来生成新实例的函数 构造函数:用new来调用,就是为了创建一个自定义类实例:是类在实例化之后一个一个具体的对象原型链:每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。那么假如我们让原型对象等于另一个类型的实例,结果会怎样?显然,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立。如此层层递进,就构成了实例与原型的链条

weixin_45045252的博客 1万+

【JavaScript原型链prototype详解】

在JavaScript中,每个对象都有一个原型(prototype)属性,它指向另一个对象。这个被指向的对象也有自己的原型,以此类推,最终形成了一个原型链。原型链的顶端是Object.prototype,它是所有对象的根原型。当我们访问一个对象的属性时,如果该对象自身没有这个属性,JavaScript会沿着原型链向上查找,直到找到匹配的属性或者到达原型链的末端。通过深入了解JavaScript原型链的概念、工作原理和应用,我们可以更好地理解JavaScript面向对象编程的机制。

zhaochen1127的博客 1179

Javascript原型链详解,一文带你彻底搞懂js原型、原型对象及原型链

原型链是 JavaScript 中的一个重要特性,它是实现对象之间继承关系的机制。在 JavaScript 中,每个对象都有一个原型属性,指向另一个对象。当试图访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,JavaScript 引擎会沿着原型链向上查找,直到找到对应的属性或方法为止。

greatming666的博客 2110
上一篇: javascript清除浏览器缓存的方法
下一篇: 原生ajax 书写
devincob
博客等级 码龄10年 72粉丝 126原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值