JS 基础篇(二):理解JS原型对象与原型链

STM32F103ZET6驱动57闭环步进电机(连线+代码) 一、设备: 1. STM32F103开发板 (普中F103的板子) 2. 57闭环电机带驱动 3. 24V/3A的直流电源,用于给电机驱动供电 简单说明:使用Keil5编程,主要使用了PWM波,外部中断和时间中断,按键控制电机使能和脱机并且控制PWM的周期,调节周期即调节电机的转速。 二、STM32开发板与电机驱动的连线: 1.PUL-、ENA-、DIR-与STM32的连接方法: 可以参考CSND的这个链接中的说明,使用共阴极接法:STM32F407-用TB6600驱动器驱动57步进电机(代码 阅读详情

目录:

一、什么是原型对象和原型链

JavaScript 常被描述为一种基于原型的语言 (prototype-based language)——每个对象对应拥有一个原型,对象以其原型为模板、从原型继承方法和属性。而同时原型也是对象,它也拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链 (prototype chain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法。

注:因为原型同时也是对象,所以也可以称呼为原型对象。

二、为什么使用原型对象

1、Javascript 并没有类继承模型,而是使用原型对象进行原型式继承。

2、原型对象的用途是为每个实例对象存储共享的方法和属性,它仅仅是一个普通对象而已。并且所有的实例是共享同一个原型对象,因此有别于实例方法或属性,原型对象仅有一份。

三、原型对象的理解

1、对象__proto__属性的值就是它所对应的原型对象,即“对象.__proto__ === 对象对应的原型对象”。

2、在Javascript中,每个函数都有一个属性为prototype指向函数自身的原型。即“函数.prototype === 自身对应的原型对象”。

案例分析:

code1

function Person(){ }  //构造函数创建对象
Person.prototype.name = "Jie"; //添加属性值到原型对象上
console.log(Person.prototype);

在这里插入图片描述
原型对象内包含我们之间添加到原型对象上的name属性,还包含一个"constructor"属性,这个属性对应创建所有指向该原型的实例的构造函数。

code2


function Person(){ }  //构造函数创建对象
Person.prototype.name = "Jie"; //添加属性值到原型对象上

var person = new Person(); //创建实例对象
person.age = 23;  //创建属性值到实例对象上
console.log(person);

在这里插入图片描述

通过上面的两段代码分析,我们可以得出实例对象person的__proto__属性就是Person的prototype属性。person.__proto__与Person.prototype均指向了原型对象。

并且通过上面的结果可以看出,实例对象person的原型(person.__proto__)的原型(person.__proto__.__proto__)是Object对象的原型。

可以将上面的分析进行图解,如下所示:
在这里插入图片描述

  • prototype: 在函数身上,指向原型对象
  • __proto__: 在对象身上(包括函数创建的对象, 函数本身和原型对象),指向自身的原型
  • constructor: 在原型对象上,指向构造函数, 在多级继承的时候,指明构造函数方便在对象上扩展原型属性
  • Object.__protp__为null: 原型的顶端

在Javascript中,每个函数都有一个原型属性prototype指向函数自身的原型,而由这个函数创建的对象也有一个__proto__属性指向这个原型。(即person.proto === Person.prototype; //true)

而函数的原型是一个对象,所以这个对象也会有一个__proto__指向自己的原型,这样逐层深入直到Object对象的原型(null),这样就形成了原型链。

函数的原型对象的constructor默认指向函数本身,原型对象除了有原型属性外,为了实现继承,还有一个原型链指针__proto__,该指针指向上一层的原型对象,而上一层的原型对象的结构依然类似,这样利用__proto__一直指向Object的原型对象上,而Object的原型对象用Object.prototype.__proto__ = null表示原型链的最顶端,如此变形成了javascript的原型链继承,同时也解释了为什么所有的javascript对象都具有Object的基本方法。

四、“prototype"和”__proto__"区别

对于所有的对象,都有__proto__属性,这个属性对应该对象的原型。
对于函数对象,除了__proto__属性之外,还有prototype属性,当一个函数被用作构造函数来创建实例时,该函数的prototype属性值将被作为原型赋值给所有对象实例(也就是被设置为所有实例的__proto__属性值)

五、查找属性

当访问一个对象的属性时,Javascript 会从对象本身开始往上遍历整个原型链,直到找到对应属性为止。如果此时到达了原型链的顶部,也就是 Object.prototype,仍然未发现需要查找的属性,那么 Javascript 就会返回 undefined 值。

例如:当你访问 person 的一个属性, 浏览器首先查找 person 是否有这个属性. 如果 person 没有这个属性, 然后浏览器就会在 person 的 __proto__ 中查找这个属性(也就是 Person.prototype). 如果 person 的 __proto__ 有这个属性, 那么 person 的 __proto__ 上的这个属性就会被使用. 否则, 如果 person 的 __proto__ 没有这个属性, 浏览器就会去查找 person 的 __proto__ 的 __proto__ ,看它是否有这个属性. 默认情况下, 所有函数的原型属性的 __proto__ 就是 Object.prototype. 所以 person 的 __proto__ 的 __proto__ (也就是 Person.prototype 的 __proto__ (也就是 Object.prototype)) 会被查找是否有这个属性. 如果没有在它里面找到这个属性, 然后就会在 person 的 __proto__ 的 __proto__ 的 __proto__ 里面查找. 然而这有一个问题: person 的 __proto__ 的 __proto__ 的 __proto__ 不存在. 最后, 原型链上面的所有的 __proto__ 都被找完了, 浏览器所有已经声明了的 __proto__ 上都不存在这个属性,然后就得出结论,这个属性是 undefined.

在这里插入图片描述

六、原型对象操作

观察以下代码:

function Person(){
    this.name = "Jie";
}
var person = new Person();

Person.prototype.say = function(){
    console.log("success");
}

我们的代码中定义了构造器,然后用这个构造器创建了一个对象实例,此后向构造器的 prototype 添加了一个新的方法。
say() 方法仍然可用于 person 对象实例——旧有对象实例的可用功能被自动更新了。这证明了先前描述的原型链模型。这种继承模型下,上游对象(父类)的方法不会复制到下游的对象(子类)实例中;下游对象本身虽然没有定义这些方法,但浏览器会通过上溯原型链、从上游对象中找到它们。这种继承模型提供了一个强大而可扩展的功能系统。

因此,我们可以将一些通用的,公用的属性或方法定义在prototype中。

例如:
1、"getInfo"方法是构造函数Person的一个成员,当通过Person构造两个实例的时候,每个实例都会包含一个"getInfo"方法。
在这里插入图片描述

2、原型就是为了方便实现属性的继承,所以可以将"getInfo"方法当作Person原型(Person.__proto__)的一个属性,这样所有的实例都可以通过原型继承的方式来使用"getInfo"这个方法了。并且改变getInfo方法全部的实例都会同步。

function Person(name, age){
    this.name = name;
    this.age = age;
}

Person.prototype.getInfo = function(){
    console.log(this.name + " is " + this.age + " years old");
};

在这里插入图片描述

参考资料:
MDN对象原型
原型对象
了解JS原型对象
__proto__和prototype

推荐系统[一]:超详细知识介绍,一份完整的入门指南,解答推荐系统相关算法流程、衡量指标和应用,以及如何使用jieba分词库进行相似推荐,业界广告推荐技术最新进展 推荐算法其实本质上是一种信息处理逻辑,当获取了用户与内容的信息之后,按照一定的逻辑处理信息后,产生推荐结果。热度排行榜就是最简单的一种推荐方法,它依赖的逻辑就是当一个内容被大多数用户喜欢,那大概率其他用户也会喜欢。但是基于粗放的推荐往往会不够精确,想要挖掘用户个性化的,小众化的兴趣,需要制定复杂的规则运算逻辑,并由机器完成。召回:当用户以及内容量比较大的时候,往往先通过召回策略,将百万量级的内容先缩小到百量级。 阅读详情

相关推荐

EZ-USB-FX3 slavefifo调试

最近使用fx3-usb-3.0调试slave fifo的传输,期间遇到许多难以理解的问题。在这里分享给大家,希望可以少走一些弯路,我自己是这样走过来的。 1,首先去官网下载原始的参考设计,并安装所提供的SDK软件:FX3SDKSetup_1.3.4.exe 2,接着把参考设计文档AN65974阅读一遍,分别创建新的SDK工程和FPGA工程。如果使用的原厂的开发板,那么可以按照文档提示,可以很顺畅的跑完整过测试。否则需要匹配自己的硬件,做针对性的更改和移植,而我走的是后一条路,于是开始了漫长的调试之路。.

YDY5659150的专栏 3630

原型对象与原型链的理解

原型 prototype:指我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype,这个属性对应着一个对象,这个对象就是我们所谓的原型对象 ,如果函数作为普通函数调用prototype没有任何作用,当函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性,指向该构造函数的原型对象,我们可以通过_proto_来访问该属性原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象, 我们可以将对象中共有的内容,统一设置到原型对象中,当我们访问对象的一个...

Xwz的博客 1181

STM32F407与AD7766实战:如何用SPI+DMA实现高速ADC数据采集(附完整代码)

本文详细介绍了如何利用STM32F407的SPI接口与DMA控制器,高效稳定地驱动24位高精度ADC芯片AD7766,实现高速连续数据采集。通过对比传统中断方式的瓶颈,阐述了SPI+DMA方案如何大幅降低CPU负载,并提供了从硬件设计、CubeMX配置到核心驱动代码的完整实战指南,帮助工程师解决高速ADC数据采集中的性能难题。

weixin_29281941的博客 186

深入理解prototype(原型对象)

对JavaScript中原型模式的理解一:什么是原型对象?有什么优点?    简单的来说,无论何时,我们创建的每一个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,这个对象包含了通过调用该构造函数所创建的对象共享的属性和方法。其实我们平常的叫法就是指:prototype就是通过该构造函数创建的某个实例的原型对象,但是其实prototype是每个构造函数的属性而已,只能说万物皆

flyingpig2016的博客 3万+

别再只看读写速度了!聊聊手机闪存eMMC、UFS3.1和SSD背后的功耗与体积玄学

本文深入探讨手机闪存技术eMMC、UFS3.1和SSD在功耗与体积设计上的关键差异。通过对比接口技术、封装工艺和温度管理,揭示移动存储如何在有限空间内平衡性能与能效,为消费者提供选购参考。重点关注UFS3.1的差分信号设计和全双工架构带来的显著优势。

weixin_27061475的博客 447

Jetson AGX Orin 新手避坑:解决‘找不到nvidia-jetpack包’的完整修复指南

本文详细介绍了Jetson AGX Orin设备在安装JetPack开发套件时遇到的'nvidia-jetpack包缺失'问题的完整解决方案。通过分析问题根源、提供分步修复指南以及系统优化建议,帮助开发者快速解决这一常见问题,充分发挥Jetson AGX Orin的边缘计算性能。

weixin_42520909的博客 460

什么是原型对象、实例、原型链讲解(简单易懂,不墨迹)

首先用构造函数(一会解释什么叫做构造函数)的方法创建一个对象 var M=function(){this.name='123'} //ƒ (){this.name='123'} var a1=new M() //M {name: "123"} console.log(a1.name) //123 构造函数:现在M就是构造函数,因为他被new过了!在js中,只要是被new过的函数都...

qq_35410544的博客 2026

C#粘包和分包问题及解决方法

一:通过图解法来描述一下分包和粘包,这样客户更清晰直观的了解:  下面对上面的图进行解释:  1.正常情况:如果Socket Client 发送的数据包,在Socket Server端也是一个一个完整接收的,那个就不会出现粘包和分包情况,数据正常读取。  2.粘包情况:Socket Client发送的数据包,在客户端发送和服务器接收的情况下都有可能发送,因为客户端发送的数据都是发送的一个缓冲...

weixin_42033401的博客 7767

什么是对象原型,什么是原型对象,什么是constructor,什么是原型链,详细解析

原型对象 : prototype 概念:原型对象是构造函数上的一个属性,用来创建公共的方法 原型对象怎么使用? 如何使用原型对象设置公共方法? //语法: 构造函数.prototype.方法名 = function() {} function Student(uname) { this.uname = uname } // 设置公共方法 Student.prototype.eat = function () { ...

super帅的博客 2919

华为OD机试双机位C卷-字符串解密(Py/Java/C/C++/Js/Go)

华为OD机试(机考)双机位C卷 【字符串解密】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试 - 字符串解密。

qq_45776114的博客 733

occ算法真值构建

occ算法真值产生

xiaomu_347的博客 610

知识总结:什么是原型、原型对象、原型链?原型链如何继承?如何访问原型对象上的属性?属性的访问规则是什么?如何设置原型对象的属性?

1、隐式原型和显示原型JavaScript 的所有对象中都有一个原型,称为隐式原型(__proto__)。隐式原型指向构建出这个实例的类的显示原型(prototype)。this.major = '语文'Student.prototype.type = '学生'let student = new Student('小草莓')console.log('对象的隐式原型:student.__proto__', student.__proto__)

小草莓的博客 2824

[QMT量化交易小白入门]-六十九、ETF动量评分策略,历史年化收益率107%

C . bar_date } 跳过') returnC . bar_date } 跳过') returnC . bar_date } 跳过') return作用:如果当前不是回测模式且不是最后一根K线,则记录日志并跳过本次任务。这是为了避免在实时交易中对尚未完成的数据进行处理。

木头大左的博客 2227

JS原型与原型链详解—JavaScript基础篇

我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。字面意思即prototype就是通过调用构造函数而创建的那个对象实例的原型对象。使用原型对象的好处是可以让所有对象实例共享它所包含属性和方法。无论什么时候,只要创建了一个新函数,就会根据一组特定规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。

qq_21280835的博客 1633

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

greatming666的博客 2110

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

带你理解JS原型和原型链

在与和我的后端朋友交流链表概念时,联想到了原型链。想到自己对原型链没什么了解,在参考一些文章和视频后(感谢网上的各位大佬!!!),带着自己的理解整理笔记如下,大家一起学习,最后还有原型链的应用场景引言大多面向对象的编程语言,比如java,都是通过类(class)实现对象的继承。JS的语言的继承不通过class,而是通过原型对象(prototype)实现,es6当中有类的继承,但是本质还是通过原型对象,为什么说继承可以减少资源的浪费呢,我们来看下面这个例子 可以看到,按照常理来说,不同实例对象的属性值不同

2302_80633106的博客 1641

JavaScript 原型对象和原型链理解

一个例子让你彻底明白原型对象和原型链 1. 之前对js中的原型链和原型对象有所了解,每当别人问我什么是原型链和原型对象时,我总是用很官方(其实自己不懂)的解释去描述。有一句话说的好:如果你不能把一个很复杂的东西用最简单的话语描述出来,那就说明你没有真正的理解。最近正在读《Javascript高级程序设计》,书中对原型对象和原型链的描述让我受益匪浅,下面仅用一个对比性的例子来说明。 我们经常会这么写 function Person () { this.name = 'John'; } var pers

annwyna的博客 1368

【JS】理解 JavaScript 的原型与原型链

在 JavaScript 中,每个函数都有一个prototype属性,这个属性指向一个对象,这个对象就是该函数的原型对象。原型对象可以包含属性和方法,这些属性和方法可以被该函数创建的所有实例对象所共享。// 输出:Hello, my name is Alice// 输出:Hello, my name is Bob在上面的例子中,Person函数的prototype属性指向一个原型对象,该原型对象包含一个sayHello方法。person1和person2都是Person。

2301_78802081的博客 1254

js原型对象和原型链理解

参考:https://blog.youkuaiyun.com/yucihent/article/details/79424506 一. 函数对象 所有引用类型(函数,数组,对象)都拥有__proto__属性(隐式原型) 所有函数拥有prototype属性(显示原型)(仅限函数) var a = {}; console.log(a.prototype); //undefined c...

qq_43553067的博客 1548

JavaScript原型对象与原型链

JavaScript原型对象与原型链 在JavaScript实际项目中,对象是十分重要的一个类型 无论是作为数据表现的一种形式或配置成工厂模式制造实例等等,这些用途在实际项目开发中都使用得非常广泛 依靠原型对象的特性可以实现一些比较模式化或适配第三方定制化的功能流程 对象 关于对象,在了解原型与原型链之前我们先了解一下对象的相关知识 对象创建 1、字面创建 const testObj = { key1: 1, key2: 2, key3: 3, objFun:function (

deft_的博客 1961

彻底理解 JavaScript 原型对象与原型链

在 ES6 之前,JavaScript 还没有 class,那它是如何实现面向对象编程?答案是通过原型(prototype),想要彻底理解什么是原型,其实并不容易,但是看完本文,你一定会有所收获

畅谈、 760

JS中关于原型对象的理解

JS中关于原型对象的理解原型对象prototype举例解释以上四点 原型对象prototype 每个函数都有prototype,该属性指向原型对象(显式原型对象) 每个实例都有_proto_属性,该属性指向原型对象(隐式原型对象) 构造函数的显示原型对象===当前构造函数实例对象的隐式原型对象 原型对象的本质:普通的Object对象,非函数对象 所有函数都是new Function产生的,包括Function自己 举例解释以上四点 // 以该函数为例 function Foo(){} var foo =

NumbSilver的博客 2990

JS原型与原型链详细解释

原型和原型链是JS实现继承的一种模型。

oi 5378

深入理解 JavaScript 原型链,夯实前端基础

至此,我们已然穿越 JavaScript 原型链的层层迷雾,窥探到其精妙复杂的内在机制。从对象创建的多样方式,到原型对象与构造函数的默契协作;从原型链的逐步构建,到其在属性查找、方法继承中的关键作用,无一不展现着 JavaScript 这门语言独特的魅力与强大的表现力。原型链作为 JavaScript 面向对象编程的核心支柱,不仅支撑起代码复用、功能扩展的高楼大厦,更让我们得以用一种简洁而优雅的方式组织代码逻辑。但同时,我们也深知其潜在的陷阱,如proto。

yan1915766026的博客 861

深入理解 JavaScript 的原型对象 `prototype`

prototypeJavaScript 的原型对象prototype是实现继承和共享方法的重要机制。通过原型链,我们能够共享方法和属性,避免重复定义,并且能够实现面向对象编程中的继承机制。理解原型及原型链的工作原理,是深入掌握 JavaScript 面向对象编程的关键。构造函数的prototype:每个函数都拥有一个prototype属性,指向该构造函数的原型对象。原型链:对象可以通过原型链继承父类的方法和属性。继承:通过修改prototype,我们可以实现继承关系。属性:每个对象都有一个。

m0_62599305的博客 1069

【JavaScript】原型对象、对象原型、原型链及其查找规则

【JavaScript】原型对象、对象原型、原型链及其查找规则

weixin_43790653的博客 2829

一个例子让你明白原型对象和原型链

开篇 之前对js中的原型链和原型对象有所了解,每当别人问我什么是原型链和原型对象时,我总是用很官方(其实自己不懂)的解释去描述。有一句话说的好:如果你不能把一个很复杂的东西用最简单的话语描述出来,那就说明你没有真正的理解。最近正在读《Javascript高级程序设计》,书中对原型对象和原型链的描述让我受益匪浅,下面仅用一个对比性的例子来说明。 我们经常会这么写 function Perso

追 3万+
上一篇: JS 基础篇(一):创建对象的四种方式
下一篇: JS 基础篇(三):原型继承
madman0621
博客等级 码龄11年 36粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值