Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >原型与原型链

原型与原型链

作者头像
用户4793865
发布于 2023-01-12 06:07:47
发布于 2023-01-12 06:07:47
31100
代码可运行
举报
文章被收录于专栏:前端小菜鸡yym前端小菜鸡yym
运行总次数:0
代码可运行

概念

原型 prototype 原型链 __proto__ [[Prototype]]

原型

思考一个问题🤔

普通的对象或者数组上有原型吗?我们试一试 原型上是可以定义属性或者变量的。我们向obj上添加 a = 666。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 let obj = {}
 let arr = []
 obj.prototype.a = 666;

控制台会发生报错。

所以,也就是说对象或者数组上没有原型

原型是函数特有的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 function fn(){

    }
 fn.prototype.name = '第一个'
  // 赋值的过程不需要给函数加括号 声明才需要()
 fn.prototype.fn2 = function(){
        console.log('添加函数')
  }
 console.dir(fn.prototype)

那么原型有什么用呢?原型用于继承。

引出原型链

我们为Person()函数的原型上,添加变量name、age 和 方法 getAge()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 function Person(){

    }
   Person.prototype.name = '张三'
   Person.prototype.age = 18
   Person.prototype.getAge = function(){
           console.log(this.age)
   }

然后实例化一个person1,调用它原型上的 getAge()。【当使用Person()去构造一个新函数时,Person()才是一个构造函数】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let person1 = new Person()
person1.getAge()          // 此时会打印出 18

有一个问题🤔,如果我在调用getAge()前 改变了 person1的age。那输出的会是什么呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let person1 = new Person()
person1.age = 28
person1.getAge()     // 此时输出 28

有人会说这是一个就近原则。其实这就引出了原型链。这是在因为在原型链上离得较近。

原型链

原型链查找规则

从当前实例属性去查找,如果找到了就返回,否则顺着原型链一层一层的往上找。直到找到null为止。如果仍旧没找到就会报错。

我们打印一下person1,可以看到其自身就有age,所以他不会去其原型[[Prototype]]上去寻找age了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      function Person(){

            }
            Person.prototype.name = '张三'
            Person.prototype.age = 18
            Person.prototype.getAge = function(){
                console.log(this.age)
            }
            // 在使用Person()构造新的函数时 才可以叫做构造函数  person1 是一个实例
            let person1 = new Person()
            person1.age = 28
            person1.getAge()     // 此时就是28
            console.log(person1)

这是谷歌浏览器

我们在看一下火狐 其原型是 __proto__

我们再试一下,原型链上没有findd()方法。我们打印它看一下结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 console.log(person1.findd())

如下会报错。

再试一下变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    console.log(person1.abc)

只是会undefined

hasOwnProperty

我们想要看这个属性是它自身的还是原型链上的,怎么办呢?这就可以用到hasOwnProperty

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 for(let item in person1){
         if(person1.hasOwnProperty(item)){
               console.log(item)
         }
   }

流程图

最后上一张沿着原型链寻找age和hasOwnProperty的图

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
js原型和原型链
每个函数都有一个 prototype 属性 每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象就是我们所说的原型对象prototype ,每一个对象都会从原型对象上"继承"属性。
hss
2022/02/25
2.2K0
js原型和原型链
【前端基础进阶】JS原型、原型链、对象详解
在上面的例子中 o1 o2 o3 为普通对象, f1 f2 f3 为函数对象。 怎么区分,其实很简单,凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。 f1,f2,归根结底都是通过 new Function()的方式进行创建的。
super.x
2019/04/12
8030
【前端基础进阶】JS原型、原型链、对象详解
原型和原型链的深入浅出
对象是 javascript 基本数据类型。对象是一种复合值: 它将很多值(原始值或者其它对象)聚合在一起,可通过名字访问这些值。
前端老鸟
2022/03/07
4500
js原型及原型链解析
首先,明确一点:js中的对象分为普通对象和函数对象,一般我们自定义的可以被new的函数称作函数对象,另外js内置了譬如:Array、Date、Object、Function、Number、String、Boolean、RegExp、Error等这些函数对象:
用户1141560
2019/05/24
2.3K0
原型与原型链
网上有太多关于原型的资料,不是一上来就各种概念,让人看到摸不着头脑,就是贴各种代码,少个通俗的解释,所以才有了这一篇文章。
前端程序之路
2021/03/28
6280
原型与原型链
JavaScript 深入之从原型到原型链
在这个例子中, Person 就是一个构造函数,我们使用 new 创建了一个实例对象 person 。 很简单吧,接下来进入正题:
Jack Chen
2018/09/14
7890
JavaScript  深入之从原型到原型链
详解原型与原型链
其实,刚开始学 JavaScript 时,就有学过原型与原型链的相关知识了,只是当时还没有养成写笔记的习惯,导致现在已经忘的七七八八了。
赤蓝紫
2023/01/02
4200
详解原型与原型链
JS基础知识总结(三):原型、原型链
上一篇JS基础知识总结(二)主要了介绍深拷贝、浅拷贝的基础知识,本文将介绍JS原型、原型链的有关内容。
前端林子
2019/01/05
2.4K1
JS基础知识总结(三):原型、原型链
第202天:js---原型与原型链终极详解
JavaScript 中,万物皆对象!但对象也是有区别的。分为普通对象和函数对象,Object 、Function 是 JS 自带的函数对象。下面举例说明
半指温柔乐
2018/09/11
9780
第202天:js---原型与原型链终极详解
深入理解JavaScript面向对象的程序设计(一)——对象的创建
类似Java等面向对象语言中创建对象的语法,在 JavaScript中可以通过执行 new操作符后跟要创建的对象类型的名称来创建。JavaScript中通过如下方式可以创建一个Object对象:
CherishTheYouth
2020/11/12
4550
深入理解JavaScript面向对象的程序设计(一)——对象的创建
原型,原型链,call/apply
JavaScript从初级往高级走系列————prototype 原型 定义: 原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。 用一张图简单解释一下定义。 1.png 每个函数上面都有一个原型属性(prototype),这个属性会指向构造函数的原型对象(Person.prototype) 每个函数的原型对象(Person.protorype)默认都有一个constructor属性指向构造函数本身(Pe
FinGet
2019/06/28
6000
原型,原型链,call/apply
原来你是这样的---原型和原型链
  把JS的原型和原型链重新梳理了一遍,然后动手绘制了一张流程图,原型和原型链的秘密就藏在这张图上。绘制流程图的好处就是在绘制的过程中,既检验自己对这个知识点的掌握状况,同时在绘制过程中会对这个知识点印象更深刻,理解更透彻,建议每个感兴趣的小伙都来身体力行一次。
tandaxia
2019/06/05
5550
原来你是这样的---原型和原型链
js中的原型和原型链
在js中每个函数(非箭头函数,一般关于原型的有关知识我们都只考虑构造函数)都会拥有一个 prototype 属性,该属性值是一个对象,我们称之为原型对象。原型对象上默认会有 constructor 属性,指向该构造函数。创建原型的主要目的是为了对象实例共享属性和方法。
用户10562852
2023/05/21
1.2K0
js中的原型和原型链
掌握原型链,再炒冷饭系列
原型链是一个比较抽象的概念,每当被问起这个问题时,总会回答得不是那么准确,好像懂,但自己好像又不太懂,真是尴尬了
Maic
2022/08/29
2070
掌握原型链,再炒冷饭系列
javascript 原型及原型链详解
我们创建的每个函数都有一个 prototype (原型)属性,这个属性是一个指针,指向一个原型对象,而这个原型对象中拥有的属性和方法可以被所以实例共享。 function Person(){ } Person.prototype.name = "Nicholas"; Person.prototype.age = 29; Person.prototype.sayName = function(){ alert(this.name); }; var person1 = new Person(); person1
柴小智
2018/04/10
7950
javascript 原型及原型链详解
this_原型链_继承
this 相关问题 1: apply、call 、bind有什么作用,什么区别? 在JS中,这三者都是用来改变函数的this对象的指向,相似点: 1.都是用来改变函数的this对象的指向的。 2.
小胖
2018/06/27
6090
一文彻底搞懂原型链
js分为「函数对象」和「普通对象」,每个对象都有__proto__属性,但是只有函数对象且「非箭头函数」才有prototype属性。
PHP开发工程师
2022/03/12
1.4K0
一文彻底搞懂原型链
JavaScript进阶--原型、原型链、闭包
在JavaScript中,每个函数 都有一个prototype属性,当一个函数被用作构造函数来创建实例时,这个函数的prototype属性值会被作为原型赋值给对象实例(也就是设置 实例的__proto__属性),也就是说,所有实例的原型引用的是函数的prototype属性。
软件架构师Michael
2022/08/09
5400
原型链分析
学习js的过程中我们绕不开两链一包的学习,尤其是在面试中,关于作用域链,前些时间分析过了,有兴趣的话可以关注一下关于JS中的作用域中的沉思,这篇文章主要是关注原型链性质特点
Yerik
2021/09/20
2720
一篇JavaScript技术栈带你了解继承和原型链
在学习JavaScript中,我们知道它是一种灵活的语言,具有面向对象,函数式风格的编程模式,面向对象具有两点要记住,三大特性,六大原则。
达达前端
2019/11/19
4680
相关推荐
js原型和原型链
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验