学习:JS进阶[10]内置构造函数
一.内置构造函数
1.基本包装类型
把基本数据类型包装成了复杂数据类型
a.
引用类型:Object,Array,RegExp,Date等
包装类型:String,Number,Boolean等
2.Object
a.三个常用静态方法(静态方法就是只有构造函数Object可以调用)
作用:Object.keys静态方法中获取对象中所有属性键
b.语法:获得所有的属性值
const o={uname:'嘿嘿',age:18}
Object.keys(o)
//返回的值是一个数组['uname','age']
c.获取所有的值
Object.values(o)
//返回的是一个数组['嘿嘿',18]
d.对象拷贝
//对象拷贝
const obj={}
Object.assign(obj,o)//将o对象拷贝到obj对象
Object.assign(o,{gender:'女'})
- 作用:Object.assign静态方法常用于拷贝对象
- 使用:经常使用的场景给对象添加属性
3.Array
方法 | 作用 | 说明 |
forEach | 遍历数组 | 不返回数组,经常用于查找遍历数组元素 |
filter | 过滤数组 | 返回新数组,返回的事筛选满足条件的数组元素 |
map | 迭代数组 | 返回新数组,返回的是处理之后的数组元素,需要使用返回的新数组 |
reduce | 累计器 | 返回leiji处理的结果,经常用于求和等 |
a.作用:reduce 返回累计处理的结果,经常用于求和等
b.基本语法:
arr.reduce(function(){},起始值)arr.reduce(function(上一次值,当前值){},初始值)const arr=[1,2,3,4]
例子:
const arr = [1, 2, 3]// 1.没有初始值const total = arr.reduce(function (prev, current) {return prev + current})console.log(total)//6//2.有初始值const total = arr.reduce(function (prev, current) {return prev + current}, 10)console.log(total)//16//3.箭头函数写法const total = arr.reduce((prev, current) => prev + current, 10)console.log(total)//16
c.执行过程
- 没有初始值,则上一次值以数组的第一个数组元素的值
- 每一次循环,把返回值给值给做为下一次循环的上一次值
- 有起始值,则起始值为上一次值
d.其他方法
前三个了解,后面的自查
e.伪数组转换为真数组
静态方法Array.from()
4.String
a.split把字符串转换为数组
const str='嘿嘿,哈哈'
const arr=str.split(',')
b.字符串的截取 substring(开始的索引号[,结束的索引号])
const str='今天开始我要自己上厕所'
//如果省略了结束的索引号,默认取到最后
str.substring(4)//输出:我要自己上厕所
结束的索引号不包含在内
开始的索引号包含在内
c.其他方法
方法 | 说明 | 返回值 |
length | 用来获取字符串的长度 | 数值 |
split('分隔符') | 用来将字符串拆分成数组 | 数组 |
substring(首索引[,末索引]) | 用于截取字符串 | 字符串 |
startsWith(检测字符串[,检测位置索引号]) | 检测是都以某字符开头 | 布尔类型 |
includes(搜索的字符串[,检测位置索引号]) | 判断一个字符串是否包含另一个字符串 | 布尔类型 |
tpUpperCase | 将字母转换成大写 | 字符串 |
toLowerCase | 用于将就转换成小写 | 字符串 |
indexOf | 检测是否包含某字符 | 返回下标 |
endsWith | 检测是否以某字符结尾 | 布尔类型 |
replace | 用于替换字符串,支持正则匹配 | 字符串 |
match | 用于查找字符串,支持正则匹配 | 数组 |
5.Number
toFixed()
- 括号里设置保留小数位的长度
- 四舍五入
二.构造函数
公共的属性和方法 封装到构造函数里
//例如
function Star(uname,age){
this.uname=uname
this.age=age
this.sing=function(){
console.log('唱歌')
}
}
三.原型
1.目标
- 构造函数通过原型分配的函数是对所有对象所共享的
- 每一个构造函数都有一个prototype属性,指像另一个对象,所以我们也称为原型对象
- 这个对象可以挂载函数,对象实例化不会多次创建原型上函数
- 我们可以把那些不变的方法,直接定义在prototype对象上,这样所有对象的实例就可以共享这些方法
- 构造函数和原型对象中this都指向实例化的对象
公共的属性卸载构造函数里,公共的方法写在原型对象
//公共属性写在构造函数
function Star(uname,age){
this.uname=uname
this.age=age}
//公共的方法写到原型对象
Star.prototype.sing=function(){
console.log('唱歌')
}
2.constructor属性
a.每一个原型对象都有的属性,该属性指向该原型对象的构造函数,即
Star.prototype.constructor===Star
3.对象原型
a.在每一个对象里面都有一个属性__proto__(前后分别两个下划线)
b.注意
- 只读,不能修改
- [[prototype]]等于__proto__
- 指向原型prototype
- __proto__(对象原型)里面也有一个constructor属性,指向创建该实例对象的构造函数
4.原型继承
a.借助原型对象来继承
公共的 部分放到原型上
//抽取人
const Person={
eyes:2,
head:1
}//定义 女人的构造函数 并且继承Person
function Woman(){}
//继承person
Woman.prototype=Person
//指会原来的构造函数
Woman.prototype.constructor=Woman
5.原型链
a.原型链--查找规则
- 当访问一个对象的属性(包括方法)时,首先查找这个对象自身有没有该属性
- 如果没有就查找它的原型(也就是proto 指向的 prototype 原型对象)
- 如果还没有就查找原型对象的原型(0bject的原型对象)
- 依此类推一直找到 Object 为止(null)
- proto 对象原型的意义就在于为对象成员查找机制提供一个方向,或者说一条路线
- 可以使用 instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上