深入浅出JavaScript原型与原型链

告别SendKeys!用DD驱动级模拟在Windows 10/11上实现真·后台键鼠操作(Python实战) 本文详细介绍了如何使用DD驱动级模拟技术在Windows 10/11上实现真后台键鼠操作,解决传统方法如pyautogui和SendKeys的局限性。通过Python实战案例,展示了驱动级模拟在游戏自动化、RPA等场景中的高效应用,包括环境配置、核心API解析及高级优化技巧。 阅读详情

js中的原型与原型链应该是老生常谈的话题了,在前端面试中基本都是必问的一个问题,但是很多人还是稀里糊涂的,只知道其表层含义,一但面试官问深一点就支支吾吾了(我自己)。为了自己下次能在面试中"装b",肝了一夜,特此记录一下,加深印象,也希望能帮到有需要的小伙伴。

先来看一张图↓

相信第一眼看到这个图的人,都觉得很繁琐,不想看了,其实你耐心的看完这篇文章就会觉得不过如此。这种图真的特别有用、特别有用、特别有用,重要的事情说三遍,那我们开始吧。

构造函数创建对象

我们先用一个构造函数来创建一个对象

function Person() {

}
var person = new Person();
person.name = 'Kevin';
console.log(person.name) // Kevin

这个例子就是用Person构造函数new了一个实例对象person,这个就不用多说了吧。

prototype

每个函数都有一个prototype属性,不信的话,你可以随便找个函数,打开F12都能看到。(注意:prototype是函数特有的属性)

function Person() {

}
// 虽然写在注释里,但是你要注意:
// prototype是函数才会有的属性
Person.prototype.name = 'Kevin';
var person1 = new Person();
var person2 = new Person();
console.log(person1.name) // Kevin
console.log(person2.name) // Kevin

那这个函数的 prototype 属性到底指向的是什么呢?是这个函数的原型吗?

其实,函数的 prototype 属性指向了一个对象,这个对象正是调用该构造函数而创建的实例的原型,也就是这个例子中的 person1 和 person2 的原型。那什么是原型呢?你可以这样理解:每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"继承"属性。让我们用一张图表示构造函数和实例原型之间的关系:

在这张图中我们用Person.prototype表示实例原型。

那么我们该怎么表示实例与实例原型,也就是 person 和 Person.prototype 之间的关系呢,这时候我们就要讲到第二个属性:

__proto__

为了证明每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型这句话的真实性,我们可以用个例子来证实。

function Person() {

}
var person = new Person();
console.log(person.__proto__ === Person.prototype); // true

既然这样,我们来更新一下关系图:

既然实例对象和构造函数都可以指向原型,那原型中是否有属性可以指向实例或者说是构造函数呢?

首先我们可以排除原型是没有属性指向实例的,因为一个构造函数可以new多个实例。

constructor

主要是讲下原型中的constructor,每个原型都有一个constructor属性指向构造函数。老规矩,可以在浏览器验证一下。

function Person() {

}
console.log(Person === Person.prototype.constructor); // true

得到下面的关系图:

从上面的关系图以及举的例子,我们来梳理总结一下:

function Person() {

}

var person = new Person();

console.log(person.__proto__ == Person.prototype) // true
console.log(Person.prototype.constructor == Person) // true
// 顺便学习一个ES5的方法,可以获得对象的原型
console.log(Object.getPrototypeOf(person) === Person.prototype) // true

了解完了构造函数、实例、实例原型之间的关系,我们来讲下实例与原型是怎么样一个关系呢?

实例与原型

当读取上面的实例的属性,找不到的时候,会发生什么呢?如果找不到的话,就会查找与实例相关联的原型的属性中查找,如果还是找不到就会去原型的原型中查找,一直找到最顶层为止。

function Person() {

}

Person.prototype.name = 'Kevin';

var person = new Person();

person.name = 'Daisy';
console.log(person.name) // Daisy

delete person.name;
console.log(person.name) // Kevin

在这个例子中,我们给实例对象 person 添加了 name 属性,当我们打印 person.name 的时候,结果自然为 Daisy。

但是当我们删除了 person 的 name 属性时,读取 person.name,从 person 对象中找不到 name 属性就会从 person 的原型也就是 person.__proto__ ,也就是 Person.prototype中查找,幸运的是我们找到了 name 属性,结果为 Kevin。

但是万一还没有找到呢?原型的原型又是什么呢?

其实原型对象就是通过 Object 构造函数生成的,结合之前所讲,实例的 __proto__ 指向构造函数的 prototype ,所以我们再更新下关系图:

原型链

那 Object.prototype 的原型呢?null,我们可以打印:

console.log(Object.prototype.__proto__ === null) // true

所以Object.prototype.__proto__ 的值为 null 跟 Object.prototype 没有原型,其实表达了一个意思。

所以查找属性的时候查到 Object.prototype 就可以停止查找了。

到此就分析完了,蓝色的这条线其实就是原型链。

总结

这里有几个点需要注意一下:

constructor

首先是 constructor 属性,我们看个例子:

function Person() {

}
var person = new Person();
console.log(person.constructor === Person); // true

当获取 person.constructor 时,其实 person 中并没有 constructor 属性,当不能读取到constructor 属性时,会从 person 的原型也就是 Person.prototype 中读取,正好原型中有该属性,所以:

person.constructor === Person.prototype.constructor

_proto_

其次是 __proto__ ,绝大部分浏览器都支持这个非标准的方法访问原型,然而它并不存在于 Person.prototype 中,实际上,它是来自于 Object.prototype ,与其说是一个属性,不如说是一个 getter/setter,当使用 obj.__proto__ 时,可以理解成返回了 Object.getPrototypeOf(obj)。

JavaScript深入浅出JavaScript继承机制:解密原型原型链面向对象实战攻略 本文全面解析了JavaScript中的继承机制,核心围绕原型链这一核心概念展开,阐述了其在对象继承中的作用重要性,并介绍了几种主要的继承实现方式。以下是文章内容的概括:📌原型基础每个JavaScript对象都隐含一个属性,通常通过__proto__访问,指向创建它的构造函数的prototype对象。构造函数的prototype本身是个对象,包含可被实例共享的方法和属性。示例展示了如何通过原型链,实例能访问到构造函数原型上的方法。📌原型链的形成查找规则。 阅读详情

相关推荐

上位机图像处理和嵌入式模块部署(开篇)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 图像处理是现实生活当中很实用的一门技术。工业上一般采用的是机器视觉,以传统算法和光源控制为主,部分采用了深度学习技术。而生活当中,则主要以二维码识别、人脸识别、车牌识别和ocr识别为主,这中间深度学习AI扮演了很重要的角色。过去,市场上的商业收费软件,主要还是以传统设备厂商提供的上位机软件为主,那这一部分是不是结合最新的npu技术,应该做出一些新的东西出来呢?

嵌入式-老费,一个分享专业嵌入式知识的blog 1292

原型原型链详解

每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。那么假如我们让原型对象等于另一个类型的实例,结果会怎样?显然,此时的原型对象将包含一个指向另一个原型的指针,相应地,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立。如此层层递进,就构成了实例原型的链条。这就是所谓的原型链的基本概念。——摘自《javascript高级程序设计》

dyy_csdn的博客 3万+

AF驱动源代码资源(cn3927、dw9714、dw9763、dw9800、pd9215bl)

这是一个基于C语言实现的AF(Auto Focus,自动对焦)驱动源代码包,来源于手机相机模块的项目。该资源包含完整的AF驱动实现逻辑,适用于嵌入式系统或相机硬件开发,旨在帮助开发者快速集成自动对焦功能。主要功能自动对焦算法:支持多种对焦模式,包括对比度检测、相位检测等,实现高效的镜头位置调整。硬件接口适配:兼容常见的图像传感器和马达驱动(如VCM声圈马达),提供I2C/SPI通信接口。参数配置:可自定义对焦参数,如步进大小、延迟时间、阈值等,支持动态调整以适应不同光照环境。错误处理:内置异常检测和日志输出,确保驱动稳定性。适用场景手机/平板相机模块开发。嵌入式设备(如无人机、智能家居相机)的对焦系统集成。学习和研究AF算法的开发者或学生。

JavaScript深入浅出了解原型原型链

一图了解原型链 1. 什么是原型原型分为两种 显示原型 prototype 和 隐示原型__proto__。 在js中所有函数基本上都有 prototype这个属性,属性值是一个普通的对象。 在js中所有引用类型都有一个__proto__(隐式原型)属性,属性值是一个普通的对象。 有一个例外 let fun = Function.prototype.bind() 此时fun没有原型。 所有引用类型的__proto__属性指向它构造函数的显示原型prototype 函数原型中有一个属性con

weixin_45174208的博客 330

一篇文章彻底搞懂原型原型链(图解+代码)

JavaScript 规定,每一个构造函数都有一个 prototype(原型) 属性,指向另一个对象,所以我们也称为原型对象,构造函数通过原型分配的函数是所有对象所共享的。

有事儿私信。 1941

深入浅出理解JavaScript原型原型链

原型链概念如大家族:对象是家族成员个体,[[Prototype]]是子女指向父母的链接,原型链是依此形成的向上祖谱线(子女→父→爷...),查找属性/方法就像找技能:自己如果不具备则向上问(父、爷...),直到Object.prototype(祖先)或null终点,自身的属性优先于原型属性(覆盖)。

m0_50296683的博客 1282

深入浅出JavaScript原型链:从入门到精通

想象一下,你在制作一个家族族谱。每个家庭成员都有自己的特点,但他们也共享家族的某些特征,比如姓氏、家族传统等。在JavaScript中,对象之间的关系就像家族成员之间的关系一样,通过原型链相互连接,实现属性的继承和共享。每个JavaScript对象(除了null)都有一个原型(prototype),原型也是一个对象。对象可以从原型中继承属性和方法。这种一层层追溯原型的过程,就形成了原型链原型链JavaScript中实现对象继承和属性共享的重要机制。

2301_76632476的博客 2009

深入浅出理解javaScript原型链

深入浅出理解javaScript原型链 作者:nicholaszjb 字体:[增加 减小] 类型:转载 时间:2015-05-09 我要评论 这篇文章主要介绍了对javaScript原型链的理解,以实例形式对javaScript原型链的概念及相关使用技巧做了较为浅显易懂的分析,需要的朋友可以参考下 本文实例讲述了javaScript原型链。分享给大家供大

jfkidear的专栏 377

深入浅出,JS原型链的工作原理

深入浅出,JS原型链的工作原理 前言:原型链,即原型链条。它是由原型原型原型原型原型原型...这一规则组合成的,经常被应用于继承。 原型的作用在JS中,每个对象都有自己的原型。当我们访问对象的属性和方法时,JS会先访问对象本身的属性和方法。如果对象本身不包含这些属性和方法,则访问对象对应的原型。 function Person(nam...

w1366352655的博客 210

js深入浅出系列之原型原型链

本文旨在帮助自己也同样帮助大家梳理S一系列知识,本文主要讲如原型、继承、作用域等知识。 1.JS原型原型链 首先我们先来使用构造函数new一个对象: function Person() { } var male=new Person(); male.name='zhangsan' 比如,在这个例子中,Person就是一个构造函数,我们使用new来创建了一个Person的实例对象male。 prototype 每个函数都会有prototype属性(箭头函数没有哦!),比如 function Person(

weixin_45683908的博客 199

深入浅出的理解js的原型链

深入浅出的理解js的原型链

qq_42938889的博客 271

深入浅出 JavaScript 原型链

追求进步的同学都关注了“1024译站”这是1024译站的第 32篇文章了解原型链继承的概念这篇文章,我们来学习一下 JavaScript 原型链。我们将了解对象之间是怎么关联的...

奇舞周刊 242

JavaScript原型对象 => 原型链深入浅出解读

JS 的原型对象你了解吗?何又被称为原型链?本文将带你深入浅出的理解它并运用它。

学而不思则罔,思而不学则殆 1147

深入浅出彻底理清js中的原型链

什么是js原型链原型链可以理解为嵌套多层的对象。在js代码中很多方法是可以复用的,如果每次都引用就会增加很多成本,于是js就给对象默认增加了一个内部属性"__proto__",通过这个属性就可以将原本独立的方法(原型)链接起来。当调用某个方法或属性就会去原型上去找,原型找不到就去原型原型上找,直到最后没有就返回undefined。

rni88的博客 884

深入浅出JavaScript原型链&继承

深入浅出JavaScript原型链&继承 转载于:https://www.cnblogs.com/lichaoqing/p/5939877.html

weixin_34356138的博客 64

浅谈js原型原型链

一、简述 对于javascript 对象(函数) 原型原型链的理解,其实不那么难,简单来说,需要理解什么是原型,怎么访问原型,什么是原型链,怎么通过原型链去访问原型,就可以大概理清楚原型原型链的基础知识。 二、浅析 1、何为原型 在js引擎启动的时候,其内核就生成了最基本的Object和Function的原型内容,也就是最原始最自然的代码。 (1)Object的原型是一个对象变量,该对象变量存...

hao255的博客 1307

深入浅出理解JS原型链继承

引出 js在ES6以前还没有class的概念,但却存在着面向对象的思想。在js中,可通过构造函数的形式来创建对象,并使用各种方式实现继承,其中原型链继承便是一种普遍的方法 什么是原型链继承 先来看一个例子 function Parent () { this.type = 'obj' } function Child () { this.name = 'zs', this.age =...

m0_37782372的博客 355

深入浅出JavaScript 原型链:对象继承的“隐形链条”

JavaScript 的世界里,**原型链**(Prototype Chain)是一个核心概念。它如同一条隐形的链条,连接着所有对象,使得代码能够高效地共享属性和方法。理解原型链,不仅能帮助你写出更优雅的代码,还能让你在调试时快速定位问题。

JakeMa1024的博客 525

javascript深入浅出——原型&原型链

原型 原型是js中实现继承的过程中产生的一个概念 继承:指在一个对象的基础上创建新对象的过程,原型指在这过程中作为基础的对象。 创建对象 var o = { f:function(){ return this.a+this.b; } } var p = Object.create(o); p.a=1; p.b=2; console.log(p.f(

天空影 912
上一篇: 如何避免 JavaScript 中的内存泄漏?
下一篇: Java多线程专题之线程与进程概述
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值