首页 > 其他分享 >JS原型链

JS原型链

时间:2023-01-05 18:44:24浏览次数:28  
标签:__ 对象 JS pers 实例 原型 构造函数

一.构造函数

1.对象

众所周知,JS是面向对象编程的弱类型语言,对象几乎涵盖了JS的所有----------万物皆对象。

那么创建对象的方式有哪些呢?

方法一:

通常object的代码表现形式是{},所以我们可以直接如下,定义一个对象

var obj={
    name:'龙儿哥哥',
    age:26,
    SayHi:function(){
        console.log('龙儿哥哥向你打了一个招呼!');
    }
}
obj.age;//26
obj.Say();//龙儿哥哥向你打了一个招呼

方法二:

我们知道,创建一个日期对象数组等使用的是new关键字进行创建,同样,普通对象也能使用new关键字创建。

var obj=new Object();
obj.name="龙儿哥哥";
obj.age=26;
obj.SayHi=function(){
    console.log('龙儿哥哥向你打了一个招呼!');
}

方法三:

区别于传统意义上的对象,这里我们要使用一个函数创建一个对象-------------构造函数,这也是这一章节的重点。

  function person(){
    this.name = '龙儿哥哥'
  }
  let pers = new person()
  console.log(pers.name);//龙儿哥哥

二.什么是原型

为了直观的让同学们理解,一下我将举几个例子来说明。

第一节:

1.通过第一章3小结,我们知道通过构造函数创建的对象,我们可以用‘.’的形式访问对象属性。

2.JS引擎的__proto__方法会指向对象的原型

 

  function Person(){
    this.name = '龙儿哥哥'
  }
  let pers = new Person()
  console.log(pers);
  console.log(pers.__proto__);

 

以上结果打印在控制台输出以下内容

 

 # 通过打印pers,可以清晰的看到pers是一个对象,其下有一个name属性,值为'龙儿哥哥',其实pers就是一个实例对象name则为这个实例对象pers实例属性

# 通过第二条,我们打印了pers.__proto__,所以打印结果指向的是pers这个实例对象原型。通过以上代码打印结果我们知道红色框内的是一摸一样的数据,也就是说这两个红色框内东东就是pers实例对象原型。

#可以看到这个原型中存在两个属性:

一个是construtor,其值为Person这个函数,由此可见这个construtor指向的就是这个构造函数本身。

第二个使用[[]]包裹的Prototype属性,其Object,这个prototype就是pers这个实例对象原型对象

三.原型对象

1.第二章我们通过构造函数new关键字知道了什么是实例对象,什么是原型,什么是原型对象以及__proto__指向问题,这一章我们就深入理解实例对象原型对象以及他们的关系

 

 

 现在我们给pers实例对象原型对象创建了一个name属性,打印结果如右图所示。

可以看到两者都有一个name属性。我们知道如果去掉Person.prototype.name = '龙哥'这行代码,我们打印pers.name,那么结果肯定是“龙儿哥哥”。

例1 那么现在打印pers.name是什么呢,思考5秒,接着看下图和你预想的有没有偏差?

例2 到这儿的时候可能你有点疑惑,不过没关系,接着往下看

 

 

 2.从上面两个例子中,我们得出了以下结论:

(1)从例1中知道,我们访问一个对象属性的时候优先访问对象的实例属性,也就是上面的this.name,如果没有,则访问原型对象属性,如例2中的age。

(2)无论是绑定在原型对象或是实例对象上的属性,我们都可以直接访问到。

四.原型链

1.通过前三章,我们应该能理解什么是构造函数,什么是实例对象,什么是原型,什么是原型对象了。啥?不明白?那这里简要的再说一下吧!!!

# 构造函数箭头函数)------对应上面的Person函数,这个函数跟我们普通调用的函数一摸一样的。

# 实例对象 ------ 通过关键字new + 函数new Person)创建的对象就是实例函数,当然我们通过new Object(){},创建的都是实例对象。

# 原型 ------ 实例对象通过关键字__proto__(pers.__proto__)访问到的对象就是原型原型包括原型对象(prototype)和构造函数,这个构造函数就是我们最开始创建的那个函数(Person)。

# 原型对象 ------ 我们通过构造函数.prototype访问到的对象就是原型对象(Person.prototype

2.知道上面的那些关系了,我们再来聊一聊什么是原型链。

 

 如上图所示,你可以把这些线(也就是关系)理解成原型链

由此可见原型链就这么简单?of course NOT!!!!!

3.我们知道__proto__指向的是一个实例对象的原型,那么原型对象的__proto__指向的是谁呢?

 

 由上图所示,

# 我们访问实例对象原型的时候,这个构造函数prototype就是他的原型

# 我们访问原型原型的时候,可以看到有许多方法,这其实是浏览器JS引擎内置的方法。这些合起来就是原型原型,这也是为什么我们能使用许多原生JS方法的原因,大家不妨点看看看这些方法的构造。

# 我们访问原型原型原型的时候,其直为null,也就是我们通过__proto__不断寻找父最终的结果指向的就是null

4.如果你认为原型链就这么点,就错了。如果我们指定某一个实例为另一个实例的原型呢?------如下图所视。

 

 打印结果如下

 

 也就是实例可以指定原型的,而依次向下查找其父最终的结果依然指向null。---------如下图所示

 

 总结:

原型链是:实例对象构造函数原型对象原型之间的关系。

 

 

 

结语:以上就是我们前端同学必须掌握的原型链,当然还有对象的赋值,继承,深拷贝和浅拷贝,这里就不做说明了,同学们自行尝试一下。

 

标签:__,对象,JS,pers,实例,原型,构造函数
From: https://www.cnblogs.com/longc-box/p/17022508.html

相关文章

  • 为什么需要JS加密来保护你的代码
    防止代码被盗用:通过对代码进行混淆加密,可以使得攻1击者很难通过阅读代码来理解代码的功能和实现细节,从而防止代码被盗用。增强代码的安全性:混淆加密的代码可以更加安全,因为......
  • Pomelo:网易开源基于 Node.js 的游戏服务端框架
    ​​Pomelo​​是基于Node.js的高性能、分布式游戏服务器框架。它包括基础的开发框架和相关的扩展组件(库和工具包),可以帮助你省去游戏开发枯燥中的重复劳动和底层逻辑......
  • JS数组对象去重同时判断两个属性是否相同
    参考:https://blog.csdn.net/m0_58849641/article/details/124750983?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-1-12......
  • JS笔记
    1、参考JavaScript面试攻略​​JavaScript参考​​2、​​js——引用类型和基本类型​​基本类型:NumberBooleanStringundefinednull引用类型:ObjectFunction3、清除Ch......
  • Jmeter BeanShell处理JSON响应
    一:Json响应如下:二:添加beanshell后置处理器  三:Json处理代码如下:importcom.alibaba.fastjson.*;publicstaticStringline_code_list(Stringjson_text){  ......
  • JSOI2009 题解
    Count二维树状数组板子题,开\(c\)个二维树状数组即可过。可以通过离线对每个权值单独操作做到只开一个二维树状数组。如果空间要求更紧的话可以cdq分治做到只开一个......
  • 前端利用formData格式进行数据上传,前端formData 传值 和 json传值的区别?
    前端利用formData格式进行数据上传,前端formData传值和json传值的区别? contentType常见的格式text/plain:纯文本格式application/json:JSON数据格式application/......
  • IM通讯协议专题学习(七):手把手教你如何在NodeJS中从零使用Protobuf
    1、前言Protobuf是Google开源的一种混合语言数据标准,已被各种互联网项目大量使用。Protobuf最大的特点是数据格式拥有极高的压缩比,这在移动互联时代是极具价值的(因为移动......
  • toastr.js 便捷弹框怎么用?怎么本地化?
    〇、简介toastr.js是一个非常简洁的弹窗消息插件,主要原因就是其脚本和样式文件较小。并且可以根据自己的需求,修改样式文件,可以应用在多种不同的场景。https://codeseve......
  • JSON.stringify踩坑
    JSON.stringify将忽略所有未定义的对象属性。constuser={name:'Stanko',phone:undefined};user.phone;//->undefinedconststringifiedUser=JSON.stringi......