JS-原型-原型链-值和引用类型
JS-原型-原型链-值和引用类型
1 回顾
1.1 Object 类型的对象
1. 创建 Object 类型的对象① 直接量 {}② Object 构造函数③ Object 函数2. 读写对象的属性.[]必须使用[]语法的两种情况:① 属性名不符合标识名规范 ② 使用变量表示属性名3. 遍历对象中所有的属性for (var i in 对象) {对象[i];}4. 删除对象中的属性delete 对象.属性名;5. 判断对象总是否存在某个属性"属性名" in 对象;
1.2 构造函数
1. 构造函数的概念构造函数用于创建对象的函数构造函数与数据类型等价,相同数据类型的对象构造函数是一样的2. 构造函数和对象的关系构造函数是对象的抽象(描述),对象是构造函数的实例一个构造函数可以对应多个对象,一个对象只能有一个构造函数3. 自定义构造函数function User(name,age) {this.name = name;this.age = age;}
1.3 this
1. 在构造函数中使用 thisthis 的值是构造函数的实例2. 在方法中使用 this谁调用该方法,this指向谁
2 原型
2.1 原型的概念
- 任何一个对象,都有原型。 原型也是个对象。
- 对象可以继承原型上的属性(方法)。
2.2 如何获取对象的原型
① 隐式原型方式
对象.__proto__
② 显示原型方式
对象的构造函数.prototype
注意: 具有相同构造函数的两个对象,原型也是一致的。
2.3 对象、构造函数、原型之间的关系
① 对象和构造函数
- 构造函数是对象的抽象(描述),对象是构造函数的实例。
- 一个构造函数可以创建多个对象,但是一个对象只能有一个构造函数。
② 对象和原型
- 每个对象都有原型。
- 对象可以使用原型上的属性(方法)。
③ 构造函数和原型
- 构造函数通过属性
prototype
可以获取构造函数的实例的原型。 - 具有相同构造函数的对象,原型也是一致的。
2.4 自定义构造函数时原型的应用
// 自定义构造函数
function User(name, age, address) {// 设置对象的属性this.name = name;this.age = age;this.address = address;
}// 把对象上的方法设置到对象的原型
User.prototype.getInfo = function() {console.log('我叫'+this.name+',我的年龄'+this.age+',我住在'+this.address);
};User.prototype.addShopcart = function() {console.log(this.name + '向购物车添加了商品');
}
2.5 判断属性是否属于对象本身
对象.hasOwnProperty('属性名');
规则:
- hasOwnProperty() 判断,只有在对象本身上的属性才返回 true,在原型上的和不存在的属性,返回false。
in
运算符,对象本身和原型上的属性都返回 true,只有不存在的属性才返回 false.
2.6 创建对象的同时指定原型
// 在对象的原型上设置方法,并没有改变对象的原型
对象.__proto__.add = function() { };// 修改了对象的原型的指向
对象.__proto__ = 新的对象;// 给构造函数实例的原型添加方法,不改变原型的指向
构造函数.prototype.add = function() { }// 修改构造函数实例的原型的指向
构造函数.prototype = 新的对象;// 创建对象的同时,指定原型
Object.create(对象);// 创建一个没有原型的对象
Object.create(null);
3 原型链
3.1 原型链的概念
每个对象都有原型,原型还是对象,所以原型也有原型,一直到一个没有原型的对象(顶层原型),组成了一个原型链。
3.2 属性查找过程
当使用对象中某个属性的时候:
- 先从对象自身查找,如果由该属性直接返回,如果没有该属性从原型上进行查找。
- 如果原型上定了该属性,直接返回;如果原型也没有该属性,继续从原型的原型上进行查找。
- 一直查找到顶层原型对象,哪里找到哪里停止,最后顶层原型对象也没有属性,返回 undefined
3.3 构造函数和原型链
- 数组的原型、数字的原型、字符粗的原型、自定义构造函数创建的实例的原型,都是 Object 的实例。
- 最顶层的原型对象是 Object.prototype
- 原型对象上constructor属性指向的并不是自己的构造函数,指向的是以该原型对象为原型的对象的构造函数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CpjKU9B5-1620368822547)(C:\Users\王秀\AppData\Roaming\Typora\typora-user-images\image-20210408112809428.png)]
4 值类型和引用类型
4.1 值类型和引用类型的概念
原始类型,也叫值类型,还可以被称为不可变类型。
对象类型,也叫引用类型,还可被称为可变类型。
4.2 值类型和引用类型的存储方式
- 变量和原始类型的数据存储在内容的栈结构中, 对象类型的数据存储到内容的堆结构中。
- 变量的值如果是原始类型,变量和值都在栈结构中; 如果变量的值是对象类型,对象存在堆结构中,栈结构中存的是变量和对象的地址。
- 如果变量a赋值给变量b,变量a的值如果是原始类型,直接把值给b。变量a的值如果是对象类型,把地址给b,导致a和b指向的是一个对象。
- 原始类型的赋值方式成为值传递;对象类型的赋值方式成为引用传递。
4.3 不可变和可变
不可变类型: 原始类型的数据,无法修改数据中的一部分,一个原始类型的数据必须作为一个整体。
可变类型: 对象类型的数据,可以修改数据中的一部分(修改属性、修改元素)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gjkOnq3i-1620368822550)(C:\Users\王秀\AppData\Roaming\Typora\typora-user-images\image-20210408112946408.png)]
总结
1. 原型什么是原型如何获取原型对象、原型、构造函数之间的关系2. 原型链3. 值类型和引用类型
改数据中的一部分,一个原始类型的数据必须作为一个整体。
可变类型: 对象类型的数据,可以修改数据中的一部分(修改属性、修改元素)。
[外链图片转存中…(img-gjkOnq3i-1620368822550)]
JS-原型-原型链-值和引用类型相关推荐
- js原型和原型链_初识JS原型/原型链/原型继承
本文思路: 原型->原型链->原型继承->基于原型的继承/ES6中的继承->__proto__与prototype 首先我们知道JS中有对象,比如: var 但是在我们没有对这 ...
- JS难点剖析-原型原型链
2019独角兽企业重金招聘Python工程师标准>>> js的原型&原型链&闭包,在很多人看来是区分JS程序员水平的关键知识点,当然对这句话我不是十分赞同.但是掌握这 ...
- 深入学习js之——原型和原型链
开篇: 在Brendan Eich大神为JavaScript设计面向对象系统的时候,借鉴了Self 和Smalltalk这两门 基于原型的语言,之所以选择基于原型的面向对象系统,并不是因为时间匆忙,它 ...
- 怎么理解js的原型链继承?
前言 了解java等面向对象语言的童鞋应该知道.面向对象的三大特性就是:封装,继承,多态. 今天,我们就来聊一聊继承.但是,注意,我们现在说的是js的继承. 在js的es6语法出来之前,我们想实现js ...
- js的原型链简单理解
js的原型链 首先,在将js的原型链之前我们先来说一下什么是原型,当我们生成一个普通对象x的时候,这个x会有一个隐藏属性x._proto_,这个属性会指向Object.prototype也就是 x._ ...
- JS基础 原型与继承
阅读目录 原型基础 原型对象 使用数组原型对象的 concat 方法完成连接操作 默认情况下创建的对象都有原型. 以下 x.y 的原型都为元对象 Object,即JS中的根对象 创建一个极简对象(纯数 ...
- JavaScript——原型/原型链中的顶层对象(图解)
本篇需要提前了解的知识储备:原型和原型链,以下仅概要介绍,不作详细讲解. 详细学习可参考: JavaScript--面向对象(封装):https://blog.csdn.net/qq_29493173 ...
- JavaScript 原型 原型链
JavaScript 原型 本文讲介绍JavaScript原型 以及JavaScript的原型链 JS中的原型和原型链 所有的引用类型(数组.函数.对象)可以自由扩展属性(除null以外) 所有的函数 ...
- JS - 11 - 原型、继承 -
感谢:https://www.bilibili.com/video/av78687689?p=2 笔记 文章目录 waht? 原型 # 原型方法.对象方法的优先级 # 函数 的原型 原型 关系 . 属 ...
最新文章
- 5分钟回顾Linux25年的发展历程与变迁
- 网站推广专员浅析网站推广期间如何防止关键词出现下降情况?
- Android学习笔记---16_采用SharedPreferences保存用户偏好设置参数
- php文件目录教程,php文件目录操作的开发过程与示例分享
- jxl读数据库数据生成xls 并下载
- 转mysql_「转」MySQL不为人知的主键与唯一索引约束
- 中国黑客常用六种工具及防御方法(转)
- 【facenet人脸识别】利用LFW数据集进行人脸比对测试
- <Linux开发> -之-系统移植 uboot移植过程详细记录(第二部分)
- 远程桌面计算机名如何删除,如何删除远程连接记录?如何用电脑识别码实现远程控制?...
- 学习笔记:GAMES101图形学入门闫令琪(五)抗锯齿
- Docker 容器的随机命名
- 2022MySQL数据库-基础篇
- 【SQL自学打卡|DAY13】——组合查询
- menubar的相关用法
- CSS简单实现圣杯布局和双飞翼布局
- 题2:找出落单的那个数
- 请帮忙。。。 使用谷歌代码网站上的开源代码,为指定站点提供AJAX定制搜索
- 致远SPM解决方案之内部邮箱插件
- Java中小数默认为double类型