深入JavaScript系列之原型和原型链

js系列教程13-原型、原型链、作用链、闭包全解 全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算法全解 js系列教程6-BOM操作全解 js系列教程7-DOM操作全解 js系列教程8-事件全解 js系列教程9-表单元素全解 js系列教程10-canvas绘图全解 js系列教程 阅读详情

JavaScript不包含传统的类继承模型,而是使用prototype原型模型

原型

引用冴羽大佬的话说就是:每一个JavaScript对象在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型"
继承"属性。

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

这个prototype属性就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有。

我们可以把那些不变的方法,直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法了

 // 利用构造函数创建对象
function Fun(x, y) {
    this.x = x;
    this.y = y;
}

// 使用原型创建一个共享方法
Fun.prototype.sum = function () {
    return this.x + this.y
}
Fun.prototype.subtract = function () {
    return this.x - this.y
}
let k = new Fun(1, 2);
let h = new Fun(5, 3)
console.log(k.sum()) // 3
console.log(h.subtract()) // 2

一般情况下,我们的公共属性定义的构造函数里面,公共的方法我们放到原型对象上

对象原型

每一个JavaScript对象都具有__proto__属性,这个属性指向对象的原型

    // 利用构造函数创建对象
function Fun(x, y) {
    this.x = x;
    this.y = y;
}

// 使用原型创建一个共享方法
Fun.prototype.sum = function () {
    return this.x + this.y
}
Fun.prototype.subtract = function () {
    return this.x - this.y
}
let k = new Fun(1, 2);
let h = new Fun(5, 3)
console.log(k) // 返回对象
console.log(k.__proto__ === Fun.prototype) // true
console.log(k.sum()) // 3
console.log(h.subtract()) // 2

每个原型都有一个constructor属性指向关联的构造函数

    // 利用构造函数创建对象
function Fun(x, y) {
    this.x = x;
    this.y = y;
}

// 使用原型创建一个共享方法
Fun.prototype.sum = function () {
    return this.x + this.y
}
Fun.prototype.subtract = function () {
    return this.x - this.y
}
let k = new Fun(1, 2);
let h = new Fun(5, 3)
console.log(k) // 返回对象
console.log(k.__proto__ === Fun.prototype) // true
console.log(Fun === Fun.prototype.constructor) // true
console.log(k.sum()) // 3
console.log(h.subtract()) // 2

方法的查找规则:

  • 首先看k对象身上是否有sum方法,如果有就执行这个对象上的 sum

img

  • 如果没有sum这个方法,因为有**__proto__**的存在,就去构造函数原型对象prototype身上去查找这个方法

构造函数、实例对象、原型对象三者之间的关联

  • 构造函数通过prototype指向原型对象,原型对象通过constructor又指回构造函数
  • 构造函数又可以指向对象实例,对象实例中也有一个__proto__指向了原型对象,原型对象又通过contructor指回构造函数

属性查找

当查找一个对象的属性时,JavaScript
会向上遍历原型链,直到找到给定名称的属性为止,到查找到达原型链的顶部,也就是 Object.prototype
但是仍然没有找到指定的属性,就会返回 undefined

    function Foo() {
    this.add = function (x, y) {
        return x + y
    }
}

Foo.prototype.add = function (x, y) {
    return x + y + 10;
}
Object.prototype.subtract = function (x, y) {
    return x - y
}
let f = new Foo()
console.log(f.add(1, 2)) // 3
console.log(f.subtract(3, 4)) // -1

通过上面运行结果可以看出,subtract
是按照向上查找来得到的结果,属性在查找的时候先查找自身的属性,如果没有再去查找原型,再没有,再往上走,一直查到Object
的原型上,所以add是自身属性结果相加

注意:我们可以赋值任何类型的对象到原型上,但是不能赋值原子类型的值

function Foo() {
}

Foo.prototype = 1; // 无效

原型链

根据原型一层一层查找就形成了一个原型链

每个JavaScript对象都具有一个属性__proto__,这个属性指向该对象的原型,而原型通过constructor
指向关联的构造函数,原型也作为一个对象实例,在读取实例属性的时候,如果找不到,就会查找与对象关联的原型中的属性,如果还查不到就去找原型的原型,直到找到最顶层为止,使用原型对象的好处是,在它上面定义的属性和方法都可以被对象实例共享。原来在构造函数中直接赋给对象实例的值,可以直接赋值给它们的原型。

img

hasOwnProperty

hasOwnProperty是Object.prototype的一个方法,它可以判断一个对象是否包含自定义属性而不是原型链上的属性,hasOwnProperty
是JavaScript中唯一一个处理属性但是不查找原型链的函数

    Object.prototype.bar = 1;
var foo = {goo: undefined}
console.log(foo.bar) // 1
console.log('bar' in foo) // true
console.log(foo.hasOwnProperty('bar')) // false
console.log(foo.hasOwnProperty('goo')) // true

注意:JavaScript 不会保护 hasOwnProperty 被非法占用,因此如果一个对象碰巧存在这个属性,就需要使用外部的 hasOwnProperty
函数来获取正确的结果

点赞关注不迷路~

个人博客已上线,欢迎来访~
传送门:夜雨炊烟

【学习路线】 游戏客户端开发入门到进阶 游戏开发是一个交叉性极强的技术领域,对开发者提出了高维度的要求。作为初学者,不要急于求成,打牢基础、注重原理、勤于实践,你的成长将会非常快速而稳健。希望这份学习路线与书单能为你指明方向,迈出职业开发者的第一步。 阅读详情

相关推荐

python123题目——判断火车票座位B(异常)

类型:流程控制。

m0_62488776的博客 3569

js原型和原型链_JS 系列二:原型与原型链

引言JS系列暂定 27 篇,从基础,到原型,到异步,到设计模式,到架构模式等,本篇是 JS系列中最重要的一章,花费 3 分钟即可理解,如果你已了解,快速浏览即可。本篇文章主讲构造函数、原型以及原型链,包括 Symbol 是不是构造函数、constructor 属性是否只读、prototype 、__proto__ 、[[Prototype]] 、原型链。一、基础入门1. 对象在JS中...

weixin_39953356的博客 114

python爬取淘宝数据

python爬取淘宝数据淘宝评论 淘宝评论 打开淘宝,选择打开需要爬取的商品的评论。在谷歌浏览器选择开发者工具,选择network,找到list_detail_rate.htm?itemId=624466733121,点击headers、previews,可以看见相应的评论数据。 爬取一页屏评论代码如下 import re import requests headers = { 'Referer': '在headers中', 'User-Agent': '在

qq_36333776的博客 5798

JavaScript系列——原型、原型链、继承

原型是JavaScript 对象的一个内置属性,我们称为prototype,它本身就是一个对象。一般地,这个原型对象值指向 其构造函数的prototype。实际上prototype名称不是标准的,所有浏览器都是用__proto__来表示对象原型的名称(普通对象和函数都有),但prototype属性是构造函数专有的,如Date.prototype。

1089

Axure RP 10表单数据提交制作

本文介绍了如何使用Axure RP 10实现表单数据提交。

Peppaaa的博客 990

CloudCompare点云变换保姆级教程:从平移、旋转到绕任意点旋转,一次搞定

本文提供CloudCompare点云变换的全面教程,涵盖从基础平移、旋转到绕任意点旋转的高级技巧。通过详细的操作步骤和实战案例,帮助用户掌握点云数据处理的核心技能,提升三维模型对齐和变换的效率与精度。

weixin_28717969的博客 291

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

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

weixin_45683908的博客 201

蓝桥杯单片机学习13——NE555方波发生器&频率测量

NE555详解、引脚图介绍、原理图及工作原理讲解、方波产生的原理、定时器测量频率的原理及使用方法、代码实现

weixin_67907028的博客 1万+

JavaScript系列—原型和原型链

1.理解原型对象 理解原型对象之前,先看一下使用原型模式编写的代码 。 function Person() { } Person.prototype.name = "Nicholas"; Person.prototype.age = 29; Person.prototype.job = "Software Engineer"; Person.prototype.sayName = funct...

jiaojsun的博客 437

2021.02.23丨Virsorter2安装使用及答疑

最近项目比较多,又在学英语,写文章的时间少了很多。最近接到一个病毒组装的项目。用之前组装工具(ABYSS、SPAdes)都没有能够组装较为完整的scafford,今天介绍一款专门用于组装病毒的工具——Virsorter。 Virsorter最早版本发布于2015年,目前已经有了第二个版本。主要用于病毒的组装的注释。详细情况可以查看文章:https://peerj.com/articles/985/ 安装流程 安装文档: https://github.com/jiarong/VirSorter2/b

4836

思维链:让AI更接近人类思维的技术

本文将探讨一种名为“思维链”的技术,它旨在让AI更接近人类思维。文章首先介绍了问题背景与核心概念,接着讲解了算法原理和数学模型,随后阐述了系统分析与架构设计,最后通过项目实战展示了思维链的实际应用,并提供了最佳实践和小结。思维链是一种旨在模拟人类思维过程的技术,它通过构建一系列相互关联的思维方式,实现对复杂问题的分析和解决。思维链算法是一种基于人类思维过程的人工智能算法,它通过构建一系列思维链,实现对问题的分析和解决。智能问答系统是一种常见的人工智能应用,它能够回答用户提出的各种问题。

AI天才研究院 943

深入学习JavaScript系列(五)——原型/原型链

JavaScript 是一种**基于原型的语言** (prototype-based language),这个和 Java 等基于类的语言不一样。 每个对象拥有一个**原型对象**,对象以其原型为模板,从原型继承方法和属性,这些属性和方法定义在对象的构造器函数的 prototype 属性上,而非对象实例本身。 上面这句话就比较绕,没关系,我们一点一点来分析: 首先 JavaScript中的对象 都会有一个内部属性 `__proto__`),该属性指向当前对象的原型;原型也是一个对象(普通对象),包含了

十九万里的博客 435

无人飞行器和车辆的协同配送物资问题——附带MATLAB代码

通过建立城市地图、生成物资点和配送任务、路径规划、协同调度以及仿真和评估等步骤,可以有效地解决物资配送的优化问题。通过建立城市地图、生成物资点和配送任务、路径规划、协同调度以及仿真和评估等步骤,可以有效地解决物资配送的优化问题。我们的目标是最小化物资配送的总时间,同时确保每个物资点都被正确配送的无人飞行器或车辆所访问。我们的目标是最小化物资配送的总时间,同时确保每个物资点都被正确配送的无人飞行器或车辆所访问。我们首先需要建立一个城市地图,包括物资点、无人飞行器的起始点和车辆的起始点。

CyberJolt的博客 950

我如何搞懂Javascript系列之原型和原型链

理解原型 JavaScript 常被描述为一种基于原型的语言——每个对象拥有一个原型对象,对象以其原型为模板、从原型继承方法和属性。原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链。 构造函数创建对象 JavaScript 中使用 new 操作符,通过构造函数初始化新对象。我们先使用构造函数创建一个对象。 function Ninja() { this.swung = true; } const ninja = new Ninja() console.lo

weixin_44002432的博客 660

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

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

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

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

JS系列——js原型链

一、js的数据类型 js的数据类型分为基本数据类型和引用数据类型,其中基本数据类型有:Undefined、Null、Boolean、String、Number;引用数据类型:Object、Array、Function,其中要注意的是:typeof(null)的值为object,而typeof(undefined)的值为undefined console.log(undefined==null) // true console.log(undefined===null) // false null表示

花落微凉梦清幽的博客 595

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

javaScript系列-javaScript的原型链

文章目录javaScript的原型链1.1 理解原型链1.2 原型链结构1、验证原型链相关的代码2、下面贴出数组对象的原型链结构图3、验证数组对象原型链结构的代码示例1.3 原型链的访问1.3.1原型链的访问规则1.4 getPrototypeOf、isPrototypeOf和instanceof1.5 原型链相关的继承1.6原型链继承1.6.1实现思想1.6.2原型链继承基本写法1.6.3原型链...

qq_45768871的博客 221

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JavaScript系列之原型与原型链

JavaScript 也是一门面向对象的语言,ES6之前并没有引入类(class)的概念,像c++ 这种典型的面向对象语言都是通过类来创建实例对象,而JavaScript是直接通过构造函数来创建实例。 所以理解两种继承模式的差异是需要一定时间的,今天我们就来了解一下原型和原型链,在介绍原型和原型链之前,我们有必要先了解一下构造函数的知识。 构造函数 构造函数模式的目的就是为了创建一个自定义类,并且...

weixin_34186931的博客 117

原型和原型链的理解_JavaScript系列之原型与原型链

前言JavaScript 也是一门面向对象的语言,ES6之前并没有引入类(class)的概念,像c++ 这种典型的面向对象语言都是通过类来创建实例对象,而JavaScript是直接通过构造函数来创建实例。所以理解两种继承模式的差异是需要一定时间的,今天我们就来了解一下原型和原型链,在介绍原型和原型链之前,我们有必要先了解一下构造函数的知识。构造函数构造函数模式的目的就是为了创建一个自定义类,并且创...

weixin_39973416的博客 85

JavaScript原型、原型对象、原型链系列详解(三)

因此,当我们调用 person.sayHello() 方法时,JavaScript 引擎会首先查找 person 对象本身是否有 sayHello 方法,如果没有,就会去它的原型对象 Person.prototype 上查找,如果还没有,就会去 Person.prototype 的原型对象 Object.prototype 上查找,以此类推,直到找到为止。这个链接的作用是如果对象本身没有某个属性或方法,就会去它的原型对象上找,如果还没有,就会去原型对象的原型对象上找,以此类推,直到找到为止。

Jarvan_I的博客 1270

关于javascript的原型和原型链系列

关于javascript的原型和原型链,看我就够了(一) https://mp.weixin.qq.com/s/rxhAu9JW3Ji4uGh_z3XW8Q 关于javascript的原型和原型链,看我就够了(二) https://mp.weixin.qq.com/s/uSPaW0yvOKQM6mEJmkPeyg 关于javascript的原型和原型链,看我就够了(三) https://...

大灰狼的小绵羊哥哥的博客 316

js系列-原型和原型链继承

前戏 世界上是先有的鸡,还是先有的蛋?这个世界难题,可能无从考究了。但如果现在问是先有的函数,还是先有的对象,那么,我的答案是先有的函数(构造函数)。那知道了这个,我们讲解原型,就从函数说起。 原型 每个函数都会创建一个prototype对象属性,它就是原型对象,也是我们调用构造函数生成的对象的原型,我们直接打印看下: function Person(name) { this.name = name; } console.dir(Person); 我们看上面的图片发现一个特别有意思的事情

前端蜗牛君 426

从原型到原型链,修炼JavaScript内功这篇文章真的不能错过!系列(二)

从原型到原型链——Js内功心法中最关键的部分之一 本文主要从构造函数 => 原型(隐式原型+显示原型)=> 原型链的顺序,渐进式讲解,希望对你有所做帮助,全文包含五部分,上下关联,我们共勉

余光的博客 4万+

【网络安全系列】JavaScript原型链污染攻击总结

文章目录0 前言1 原理2 利用 0 前言 原型链污染,是 NodeJs 中常见的漏洞,在做 antCTF 时也遇到的原型链污染题目,在此记录自己学习原型链污染的过程。 1 原理 0x01 问:原型链有什么作用? 用来做继承,也就是基于原有的代码做一定的修改。下面是一个使用原型链实现继承的案例: function Parent () { this.name = 'kevin'; } Parent.prototype.getName = function () { console.log(t

读万卷书,行万里路。 2650

JavaScript原型、原型对象、原型链系列详解(四)

在访问 john 对象的属性时,它会先查找自身是否有该属性,然后会沿着原型链查找 Person.prototype 对象,最终查找到了 Object.prototype 对象。原型链是原型对象之间的连接,每个原型对象都有一个指向父级原型对象的指针,即Prototype属性。原型是函数的一个属性,它指向原型对象的引用。JavaScript中的原型、原型对象和原型链是密不可分的概念,它们之间构成了对象继承的基础。当我们创建一个子类时,它的原型对象指向父类的实例,从而实现了父类的属性和方法的继承。

Jarvan_I的博客 994

JS系列-原型链问题

原型与原型链 JavaScript中使用构造函数来新建一个对象的,每一个构造函数的内部都有一个prototype属性,它的属性值是一个对象(也叫做`原型对象`),它包含了可以由该构造函数的所有实例共享的属性和方法。 当使用构造函数新建一个对象后,在这个对象的内部将包含一个指针,这个指针会指向构造函数的 prototype属性对应的值,在ES5 中这个指针被称为对象的原型对象。一般来说不应该能够获取到这个值的,但是现在浏览器中都实现了_proto_属性来访问这个属性,但是最好不要使用这个属性,因为它不是规范

Lycheezzj的博客 754

JS 系列二:原型与原型链

引言JS系列暂定 27 篇,从基础,到原型,到异步,到设计模式,到架构模式等,本篇是 JS系列中最重要的一章,花费 3 分钟即可理解,如果你已了解,快速浏览即可。本篇文...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 198
上一篇: 关于浅拷贝深拷贝那些事儿
下一篇: 使用IDEA创建springboot
夜雨炊烟
博客等级 码龄8年 26粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜雨炊烟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值