// 构造函数是一种特殊的函数,主要用来初始化对象
// 通过构造函数 可以快速创建多个类似的对象
// 以前如果需要创建对象,那需要一个个声明
// 引入了构造函数之后:
// function Person(uname, age, gender) {
// this.uname = uname
// this.age = age
// this.gender = gender
// }
// const p1 = new Person('94', 18, '男')
// const p2 = new Person('穹影', 18, '男')
// const p3 = new Person('vista喵', 18, '男')
// console.log(p1)
// console.log(p2)
// console.log(p3)
// 注意点!!!!
// 1.实例化构造函数时,如果没有参数可以省略new,使用new关键字调用函数的行为被称为实例化。
// 2.构造函数内部无需写return,返回值即为新创建的对象,构造函数内部的return返回的值无效,所以不要写return。
// 3.new Object() new Date() 也是实例化,构造函数。
//
// 练习:利用构造函数创建多个对象
// 需求:写一个Goods构造函数
// 里面包含属性 name 商品名称 price 价格 count 库存数量
// 实例化多个商品对象,并打印到控制台,例如 小米 1999 20 华为 3999 59 vivo 1888 100
// function Goods(uname, price, count) {
// this.uname = uname
// this.price = price
// this.count = count
// }
// const G1 = new Goods('小米', 1999, 20)
// const G2 = new Goods('华为', 3999, 59)
// const G3 = new Goods('vivo', 1888, 100)
// console.log(G1)
// console.log(G2)
// console.log(G3)
// 实例成员:通过构造函数创建的对象成为实例对象,实例对象中 属性 和 方法 称为实例成员(实例属性和实例方法)
// 为构造函数传入参数,创建结构相同但值 不同的对象
// 构造函数创建的实例对象 彼此独立 互不影响
// 静态成员:构造函数的属性和方法被称为静态成员(静态属性和静态方法)
// 静态成员只能构造函数来访问
// 静态方法中的this指向构造函数
// 比如 Date.now() Math.PI Math.random()
// 内置构造函数
// 在JS中最主要的数据类型有六种:都有专门的构造函数,称为包装类型
// 基本数据类型:字符串,数值,布尔,undefined,null
// 引用类型:JS中几乎所有的数据都可以基于构造函数创建
// 对象 特殊情况:
// const str = 'andy'
// console.log(str.length) JS中 在底层完成:把简单数据类型包装,为了引用数据类型
// Object,Array,RegExp(正则表达式),Date等
// 包装类型:String,Number,Boolean等
// Object
// Object是内置的构造函数,用于创建普通对象
// 例:const user = new Object({uname:'94',age :18})
// 推荐使用字面量方式声明对象,而不是Object构造函数
// 三个常用静态方法(静态方法就是只有构造函数Object可以调用的)
// 1.获取对象里面的属性和值:Object.keys 静态方法,获取对象中的所有属性(键)
// const o = {uname:'94', age:18}
// console.log(Object.keys(o))
// console.log(Object.values(o))
//注意:返回的是数组
// 2.拷贝 Object.assign
// const o = { uname: '94', age: 18 }
// const obj = {}
// Object.assign(obj, o)
// console.log(obj)
// 常用使用场景:给对象添加属性
// Object.assign(o,{gender:'男'})
// Array
// Array是内置的构造函数,用于创建数组
// const arr = new Array(3,5)
// console.log(arr)
// 创建数组建议使用字面量创建,不用Array构造函数创建
// 数组常见实例方法——核心方法
// 遍历数组:foreach(不返回数组,常用语查找遍历数组元素)
// 过滤数组:filter(返回新数组,返回的是筛选满足条件的数组元素)
// 迭代数组:map(返回新数组,返回的是处理之后的数组元素,想要使用返回的新数组的场合)
// 累计器:reduce(返回累计处理的结果,经常用于求和等)
// arr.reduce(function(){}),起始值) //function是回调函数
// arr.reduce(function(上一次值,当前值){},起始值)
// 如果有起始值,则把初始值累加到里面
// 例:
// const arr = [1,5,8]
// 没有初始值
// const total = arr.reduce(function(prev,current){
// return prev + current
// })
// console.log(total)
// 有初始值
// const total = arr.reduce(function(prev,current){
// return prev +current
// },10)
// console.log(total)
// 使用箭头函数的方法
// const total = arr.reduce((prev, current) => prev + current, 10)
// console.log(total)
// reduce执行过程
// 1.如果没有起始值,则上一次值以数组中第一个数组元素的值
// 2.每一次循环,把返回值作为下一次循环中的上一次值
// 3.如果有起始值,则起始值作为上一次值
// 练习:根据数据计算当月支出薪资
// const arr = [{
// name: '张三',
// salary: 10000
// }, {
// name: '李四',
// salary: 10000
// }, {
// name: '赵五',
// salary: 10000
// }
// ]
// const arr = [{
// name: '张三',
// salary: 10000
// }, {
// name: '李四',
// salary: 10000
// }, {
// name: '赵五',
// salary: 10000
// }
// ]
// // const total = arr.reduce((prev, current) => prev + current.salary, 0)
// // console.log(total)
// // 每个人涨薪30% 当月支出多少薪资
// const total = arr.reduce((prev, current) => prev + current.salary * 1.3, 0)
// console.log(total)
console