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

一、创建对象有几种方法

  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和2var o =Object.create(func.prototype)// 步骤3 var k = func.call(o)// 步骤4if (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.hqwc.cn/news/56495.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无涯教程-Lua - Modules(模块)

模块就像可以使用 require 加载的库,并且具有包含Table的单个全局名称,该模块可以包含许多函数和变量。 Lua 模块 其中一些模块示例如下。 -- Assuming we have a module printFormatter -- Also printFormatter has a funtion simpleFormat(arg) -- …

Oracle-expdp报错ORA-39077、06502(Bug-16928674)

问题: 用户在使用expdp进程导出时,出现队列报错ORA-39077、ORA-06502 ORA-31626: job does not exist ORA-31638: cannot attach to job SYS_EXPORT_SCHEMA_01 for user SYS ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95 ORA-06512: at "SYS.KUPV$…

【Paper Reading】CenterNet:Keypoint Triplets for Object Detection

背景 首先是借鉴Corner Net 表述了一下基于Anchor方法的不足: anchor的大小/比例需要人工来确认anchor并没有完全和gt的bbox对齐,不利于分类任务。 但是CornerNet也有自己的缺点 CornerNet 只预测了top-left和bottom-right 两个点,并没有…

vscode 第一个文件夹在上一层文件夹同行,怎么处理

我的是这样的 打开终端特别麻烦 解决方法就是 打开vscode里边的首选项 进入设置 把Compact Folders下边对勾给勾掉

CCF-CSP 29次 第三题【202303-3 LDAP】(多个STL+递归)

计算机软件能力认证考试系统 #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <unordered_map> #include <string>using namespace std;typedef long long LL;const int N 2510, M 510;int n…

【web逆向】全报文加密及其登录流程的分析案例

aHR0cHM6Ly9oZWFsdGguZWxkZXIuY2NiLmNvbS9zaWduX2luLw 涉及加密库jsencrypt 定位加密点 先看加密的请求和响应&#xff1a; 全局搜索加密字段jsondata&#xff0c;这种非特定参数的一般一搜一个准&#xff0c;搜到就是断点。起初下的断点没停住&#xff0c;转而从调用栈单步…

概念解析 | 生成式与判别式模型在低级图像恢复与点云重建中的角力:一场较量与可能性探索

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:生成式模型与判别式模型在低级图像恢复/点云重建任务中的优劣与特性。 生成式与判别式模型在低级图像恢复与点云重建中的角力:一场较量与可能性探索 1. 背景介绍 机器学习…

【小吉带你学Git】idea操作(2)_版本和分支的相关操作

&#x1f38a;专栏【Git】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;版本⭐首先创建一个项目⭐添加暂存区⭐提交本地库&#x1f33…

链表OJ题

题目一&#xff1a;206反转链表 题目要求&#xff1a; 思路分析&#xff1a; 代码实现&#xff1a; struct ListNode* reverseList(struct ListNode* head){ //n1,n2反转指针 n3链接下一个结点的指针struct ListNode* n1,*n2,*n3;n1 NULL;n2 head;if(n2)//有可能head本身…

gin和gorm框架安装

理论上只要这两句命令 go get -u gorm.io/gorm go get -u github.com/gin-gonic/gin然而却出现了问题 貌似是代理问题&#xff0c;加上一条命令 go env -w GOPROXYhttps://goproxy.cn,direct 可以成功安装 安装gorm的数据库驱动程序 go get -u gorm.io/driver/mysql

按轨迹运行

文章目录 import math import timeimport numpy as np import matplotlib.pyplot as pltdef plot_arrow(x, y, yaw, length=5, width=1):dx = length * math.cos(yaw)dy = length * math.sin(yaw)plt.arrow(x, y, dx, dy, head_length=width, head_width=width)plt.plot([x, x …

Mybatis-plus动态条件查询QueryWrapper的使用

Mybatis-plus动态条件查询QueryWrapper的使用 一&#xff1a;queryWrapper介绍 queryWrapper是mybatis plus中实现查询的对象封装操作类&#xff0c;可以封装sql对象&#xff0c;包括where条件&#xff0c;order by排序&#xff0c;select哪些字段等等&#xff0c;他的层级关…