【基础类】—原型链系统性知识

news2024/11/23 13:49:47

一、创建对象有几种方法

  1. 字面量创建对象
    1-1. 什么是字面量
    字面量就是所见即所,指的是常量;用来为变量赋值时的常数量
    代码例子:123;‘ABC’, {name: ‘张三’}, undefined , true
    生活例子:门店的招牌,手机号,身份证,排队号

1-2 字面量对象: 通过字面量的方式创建对象

let o1 = {name: '张三', age: 22}
// 生活例子: 一个叫张三的对象
  1. Object 方法创建对象
    2-1 Object方法将输入的参数转换为对象
    在这里插入图片描述
    ① null 和 undefined 返回空对象
    ② 数字返回数字类型的对象;字符串返回字符串类型对象;函数返回函数对象
    ③ 参数如果是对象,返回参数本身
    生活例子:Object方法类似于分类,你把任意物品给到某个人或机器,然后他会对物品分类,
    比如 给香蕉,水果:香蕉;菠菜, 蔬菜:菠菜,薯片,零食:薯片

2-2 Object 方法创建对象

let o2 = new Object({name: '菠菜'})
// 生活例子:一个名叫菠菜的对象
  1. 构造函数创建对象
    3-1 什么是构造函数
    用 new 关键字来调用的函数,称为构造函数。构造函数首字母一般大写
let M = function () {
    this.name ='243'
}
// 普通函数
console.log(M) 
ƒ () {
    this.name ='243'
}
// new M()构造函数 , 构造函数返回函数内部的对象,如果内部有定义属性,返回内部属性对象,如没有返回空对象
console.log(new M())
M {name: '243'}

3-2 用构造函数创建对象

let M = function () {
	this.name = '张三'
}
let o3 = new M()
o3
M {name: '张三'}
  1. Object.create创建一个新对象
    静态方法以一个现有对象作为原型,创建一个新对象
var P = {name: 'o4'}
var o4 = Object.create(P)
o4 
{}

二、原型、构造函数、实例、原型链

let M = function () {
   this.name = '张三'
}
let o3 = new M()

在这里插入图片描述

  1. 构造函数: 普通函数被new 使用后,就是构造函数, M就是构造函数
  2. 实例:任意对象就是一个实例,上述o1、o2、o3、o4都是实例
  3. 构造函数可以通过 new运算符 生成一个实例,例如o3
  4. 构造函数也是函数,所有函数上都有prototype属性(函数声明时自动生成),构造函数的prototype属性指向原型对象(初始化空对象)
  5. 原型对象 的构造器 constructor 默认指向声明的构造函数,
M.prototype.constructor  === M
true
  1. 实例的__proto__属性指向M构造函数的原型对象
o3.__proto__===M1.prototype
true

在这里插入图片描述
7. 原型链:创建一个实例对象,通过实例对象的__proro__属性找创建实例的原型对象,一直往上找,直到找到构造函数Object.prototype 原型对象,原型链的顶点为null, 这个链条就是原型链

o5.__proto__.__proto__ === Object.prototype
true
o5.__proto__.__proto__.__proto__
// null
  1. 原型对象增加属性和方法,都可以被实例所继承,所以当多个实例有相同的方法就可以存在原型对象上
let M = function (name) {
	this.name = name
}
let o3 = new M()
M.prototype.say = function () {
    console.log('你好')
}
o3.say()
// 你好
  1. 构造函数的__proto__属性 等于 函数的原型对象
M.__proto__ === Function.prototype

三、instanceof的原理

instanceof : 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上

// o3 是 M构造函数的一个实例
o3 instanceof M 
true
// o3 是原型链上构造函数的实例
o3 instanceof Object
true
// M的原型对象的__proto__ === Object的原型对象
M.prototype.__proto__ === Object.prototype
true

// o3的__proto__的构造器 === M,表示o3由M构造函数直接生成
o3.__proto__.constructor === M
true
// o3的__proto__的构造器 不等于Object,表示o3不是由Object 构造函数直接生成
o3.__proto__.constructor === Object
false

四、new运算符

new 运算符的工作原理:

let M = function (name) {
	this.name = name
}
let o3 = new M()
  1. new 的第一个步骤,一个新对象被创建
  2. 新对象继承构造函数的原型对象, var o3 = new M(), o3 继承 M.prototype 上的方法和属性
  3. 构造函数M被执行。 执行的时候,相应的参数会被传入,同时上下文(this)会被指定为这个新实例
    PS:当构造函数不传递参数时, new M 等同于 new M()
  4. 如果构造函数返回了一个对象,那么这个对象会取代整个new出来的结果。如果构造函数没有返回对象,那么new出来的结果为步骤1创建的对象(空对象)
var new2 = function (func) {
    // 步骤1和2
    var o =Object.create(func.prototype)
    // 步骤3 
    var k = func.call(o)
    // 步骤4
    if (typeof k === 'object') {
        return k
    } else {
        return o
    }
}

o6 = new2(M)
M {name: '张三'}
o6 instanceof M
true
o6 instanceof Object
true
o6.__proto__.constructor === M
true

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/841914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker安装Mysql、Redis、nginx、nacos等环境

相关系列文章: 1、DockerHarbor私有仓库快速搭建 2、DockerJenkinsHarbor 1、服务器 Ip部署内容说明192.168.88.7Docker、Mysql、redis、nacosnode1192.168.88.8Docker、Mysql、redis、nacosnode2192.168.88.9Docker、redis、nacos、nginxnode3 2、安装PXC8.0 Mys…

【已解决】Java 中使用 ES 高级客户端库 RestHighLevelClient 清理百万级规模历史数据

🎉工作中遇到这样一个需求场景:由于ES数据库中历史数据过多,占用太多的磁盘空间,需要定期地进行清理,在一定程度上可以释放磁盘空间,减轻磁盘空间压力。 🎈在经过调研之后发现,某服务…

AI一键生成短视频

AI一键生成推文短视频 阅读时长:10分钟 本文内容: 结合开源AI,一键生成短视频发布到常见的某音,某手平台,狠狠赚一笔 前置知识: 1.基本的 python 编程知识 2.chatGPT 使用过 3.stable diffution 使用过 成果…

一键开启ChatGPT“危险发言”

‍ ‍ 大数据文摘授权转载自学术头条 作者:Hazel Yan 编辑:佩奇 随着大模型技术的普及,AI 聊天机器人已成为社交娱乐、客户服务和教育辅助的常见工具之一。 然而,不安全的 AI 聊天机器人可能会被部分人用于传播虚假信息、操纵舆…

冠达管理:稳增长政策密集加码 顺周期板块有望持续表现

上星期A股商场回暖显着,首要宽基指数大都震荡收涨;日均成交额上升至约9600亿元;北向资金延续净买入,周净买入A股124.7亿元。职业层面,方针预期催化下,顺周期方向的金融、房地产等职业领涨。 机构以为&#…

方法区内存溢出及常量池

22 方法区-定义 是所有线程共享的一块区域。 存储了和类结构相关信息。运行时常量池, 方法区在虚拟机启动时被创建,逻辑上是堆的组成部分。方法区内存不足,也会导致oom异常。 是一个概念上的东西, 1.6使用永久代作为方法区&#…

Mybatis引出的一系列问题-spring多数据源配置

在日常开发中我们都是以单个数据库进行开发,在小型项目中是完全能够满足需求的。但是,当我们牵扯到像淘宝、京东这样的大型项目的时候,单个数据库就难以承受用户的CRUD操作。那么此时,我们就需要使用多个数据源进行读写分离的操作…

在Linux服务器上搭建Git

环境 服务器:Ubuntu 客户端:Win11 1、在服务器上安装Git(服务器中处理) 在服务器上执行git --version 如果出现: 则,已经安装Git,跳过此步骤。 如果没有,则: 执行…

前端个人年度工作述职报告(二十篇)

前端个人年度工作述职报告篇1 尊敬的各位领导、各位同仁: 大家好!按照20__年度我公司就职人员工作评估的安排和要求,我认真剖析、总结了自己的工作情况,现将本人工作开展情况向各位领导、同仁做以汇报,有不妥之处,希…

ElasticSearch详细操作

ElasticSearch搜索引擎详细操作以及概念 文章目录 ElasticSearch搜索引擎详细操作以及概念 1、_cat节点操作1.1、GET/_cat/nodes:查看所有节点1.2、GET/_cat/health:查看es健康状况1.3_、_GET/_cat/master:查看主节点1.4、GET/_cat/indices&a…

内存快照:宕机后,Redis如何实现快速恢复?RDB

AOF的回顾 回顾Redis 的AOF的持久化机制。 Redis 避免数据丢失的 AOF 方法。这个方法的好处,是每次执行只需要记录操作命令,需要持久化的数据量不大。一般而言,只要你采用的不是 always 的持久化策略,就不会对性能造成太大影响。 …

OpenAI因担心隐私问题而阻止GPT-4图像功能的发展

据《纽约时报》报道,GPT-4的图像能力可以识别某些个人。 OpenAI一直在测试其支持图像识别的多模态GPT-4版本,以便计划中的广泛发布。然而,据周二《纽约时报》报道,出于对其可能识别特定个体的担忧,公众访问被限制了。…

(2023国赛必看)零基础挑战一周拿下数学建模国奖

1、 数学建模国赛介绍 1.1 数学建模国赛是什么?如何评奖 全国大学生数学建模竞赛是全国高校规模最大的课外科技活动之一。该竞赛每年9月(一般在上旬某个周末的星期五至下周星期一共3天,72小时)举行,竞赛面向全国大专院…

使用vscode远程登录以及本地使用的配置(插件推荐)

1、远程登陆ssh 1.1打开vscode插件商店,安装remote-ssh插件 远程ssh添加第三方插件:vscode下链接远程服务器安装插件失败、速度慢等解决方法_vscode远程安装不上扩展_Emphatic的博客-CSDN博客 转到定义,选中代码->鼠标右键->转到定义…

Linux:在使用UEFI固件的计算机上内核是如何被启动的

前言 启动计算机通常不是一件难事:按下电源键,稍等片刻,你就能看到一个登录界面,再输入正确的密码,就可以开启一天的网上冲浪之旅了。 但偶尔这件事没那么顺利,有时候迎接你的不是熟悉的登录界面&#xf…

SSM(Vue3+ElementPlus+Axios+SSM前后端分离)--功能实现[五]

文章目录 SSM--功能实现实现功能09-带条件查询分页显示列表需求分析/图解思路分析代码实现测试分页条件查询带条件分页查询显示效果 实现功能10-添加家居表单前端校验需求分析/图解思路分析代码实现完成测试测试页面效果 实现功能11-添加家居表单后端校验需求分析/图解思路分析…

【HTML】<input>

分类 text password number button reset submit hidden radio checkbox file image color range tel email(火狐有校验,360浏览器无校验。) url datetime(火狐、360浏览器不支持) search date、month、week、time、da…

计算机网络-三种交换方式

计算机网络-三种交换方式 电路交换(Circuit Switching) 电话交换机接通电话线的方式称为电路交换从通信资源分配的角度来看,交换(Switching)就是按照某种方式动态的分配传输线路的资源 电话交换机 为了解决电话之间通信两两之间连线过多,所以产生了电话…

【Docker】docker镜像+nginx部署vue项目:

文章目录 一、文档:二、打包vue项目:三、配置nginx:四、配置Dockerfile:五、构建镜像:六、运行容器:七、最终效果: 一、文档: 【1】菜鸟教程:https://www.runoob.com/do…

windows下以指定用户访问SMB服务器进行读写

一 概述 最近遇到一个问题,linux 的 smb服务器开启匿名访问,windows访问linux文件夹不需要用户名密码就可以进去使用,但是存在一个问题,ssh连接到linux 后修改的文件,在windows已smb方式下打开某个文件修改 是没有权限…