Day 8
对象,类和面向对象编程
理解对象:
- 创建自定义对象的方式:
- 创建一个Object的一个新的实例,然后给他添加属性方法,
- 通过字面量的形式
- 创建自定义对象的方式:
属性的额类型:
数据属性:包含一个保存数据值的位置 ,值会从这个位子读取,也会写入到这个位置
[[Configurable]] :表示属性是否可以通过 delete 删除并重新定义,是否可以修改它的特性,以及是否可以把 它改为访问器属性。默认情况下都是'true'
[[Enumberable]] :表示属性是否可以通过 for-in 循 环返回。默认情况下,所有直接定义在对象上的属性的这个特性都是 true ,
[[Writable]] :表示属性的值是否可以被修改。默认情 况下,所有直接定义在对象上的属性的这个特性都是 true
[[Value]] :包含属性实际的值。这就是前面提到的那个读取和写入属性值的位置。这个特性的默认值为undefined 。
总结: 4种属性分别是:是否可被删除,是否可被循环,是否可被修改,实际值位置,
例子1:
let person = {}; Object.defineProperty(person, "name", { configurable: false, value: "Nicholas" }); console.log(person.name); // "Nicholas" delete person.name; console.log(person.name); // "Nicholas"要修改对象的默认特性,就要使用Object.defineProperty() 方法,这个方法接受三个参数,对象,对象的属性,对象属性的数据属性,像上例,对象属性name的数据属性中的删除属性被禁用,所以删除操作无法进行
访问器属性:访问器属性不包含数据值。相反,它们包含一个获取(getter)函 数和一个设置(setter)函数
对象解构
例子1:
// 不使用对象解构 let person = { name: 'Matt', age: 27 }; let personName = person.name, personAge = person.age; console.log(personName); // Matt console.log(personAge); // 27 // 使用对象解构 let person = { name: 'Matt', age: 27 }; let { name: personName, age: personAge } = person; console.log(personName); // Matt console.log(personAge); // 27属性名称一定要一 一对应,不对应的属性名称,会被解构成undefined
部分解构,如果涉及多个属性的解构赋值,开始的赋值成功,后面的赋值出错,则整个解构只会完成一部分,未完成的部分会成为undefined,
对象的迭代
简单说就是循环对象,在JavaScript有史以来的大部分时间内,迭代对象属性都是一个难
题,Object.values() 和 Object.entries() 接收一个对象,返回 它们内容的数组
Object.values() 返回对象值的数组,
Object.entries() 返回键/值对的数组
const o = { foo: 'bar', baz: 1, qux: {} }; console.log(Object.values(o)); // ["bar", 1, {}] console.log(Object.entries((o))); // [["foo", "bar"], ["baz", 1], ["qux", {}]]
继承和组合继承,里面涉及到原型链和构造器,单独分一章讲
实例,原型和类成员:
reduce
reduce()方法接受一个函数作伪累加器,为数组中的每一个元素一次执行回调函数,接受4个参数:初始值,当前元素值,当前索引,原数组
previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
currentValue (数组中当前被处理的元素)
index (当前元素在数组中的索引)
array (调用的数组) initialValue (作为第一次调用 callback 的第一个参数)。
例子1:累加
let arr = [3,9,4,3,6,0,9] let sum = arr.reduce((pre, item) => { //pre是上一次调用的返回值,第一次就是你定义的初始值,item是当前循环到的这一项, console.log(pre)//0,3,11 return pre + item }, 0)//初始值0 console.log(sum) // 34例子2:求最大值
var max = arr.reduce((prev, cur) => { return Math.max(prev,cur); });小结:等于就是利用reduce特性,能拿到上一次的结果,和这一次的结果,直接比较
例子3:实现多维度,对象的数据叠加
const scores = [ { subject: 'math', score: 88 }, { subject: 'chinese', score: 95 }, { subject: 'english', score: 80 } ]; const dis = { math: 0.5, chinese: 0.3, english: 0.2 } const sum = scores.reduce((pre,item) => { console.log(item.subject) //math,chinese,english console.log(dis[item.subject])//0.5,0.3,0.2 return pre + item.score * dis[item.subject] },0) console.log(sum) // 88.5例子4:计算每个元素出现的次数
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']; let nameNum = names.reduce((pre,cur)=>{ if(cur in pre){ pre[cur]++ }else{ pre[cur] = 1 //这里等于是pre[Alice = 1] } return pre },{}) console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}
本文使用 mdnice 排版