定义: 在 JavaScript 中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。
定义:
class name { //创建
// class body
}
var xx = new name(); //实例化
constructor() 方法是类的构造函数(默认方法),用于传递参数,返回实例对象
,通过 new 命令生成对象实例时,自动调用该方法。如果没有显示定义, 类内部会自动给我们创建一个constructor()
注意:方法之间不能加逗号分隔,同时方法不需要添加 function 关键字。
子类可以继承父类的一些属性和方法。
class Father {
constructor() {
}
money() {
console.log(100);
}
}
class Son extends Father {
}
var son = new Son();
son.money(); //==>100
super 关键字用于访问和调用对象父类上的函数。可以调用父类的构造函数,也可以调用父类的普通函数
class Father {
constructor(x, y) {
this.x = x;
this.y = y;
}
sum() {
console.log(this.x + this.y);
}
}
class Son extends Father {
constructor(x, y) {
super(x, y); //super 关键字调用了父类中的构造函数
}
}
var son = new Son(1, 2);
var son1 = new Son(11, 22);
son.sum(); //==> 3
son1.sum(); //==> 33
总结:
类中的方法使用的是 constructor 里面的数据,所以子类要使用父类的方法,需要把值传给父类,否则this的指向不一致,会报错
注意: 子类在构造函数中使用super, 必须放到 this 前面 (必须先调用父类的构造方法,在使用子类构造方法)
构造函数是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与 new 一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。
JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象。注意这个 prototype 就是一个对象,这个对象的所有属性和方法,都会被构造函数所拥有。
我们可以把那些不变的方法,直接定义在 prototype 对象上,这样所有对象的实例就可以共享这些方法。
对象原型( proto)和构造函数(prototype)原型对象里面都有一个属性 constructor 属性 ,constructor 我们称为构造函数,因为它指回构造函数本身。
constructor 主要用于记录该对象引用于哪个构造函数,它可以让原型对象重新指向原来的构造函数。
对象实例能指回构造函数是通过原型对象的 constructor 指回去的
构造函数中的this 指向我们实例对象.
原型对象里面放的是方法, 这个方法里面的this 指向的是 这个方法的调用者, 也就是这个实例对象.
可以通过原型对象,对原来的内置对象进行扩展自定义的方法。比如给数组增加自定义求偶数和的功能。
注: 数组和字符串内置对象不能给原型对象覆盖操作 Array.prototype = {} ,只能是 Array.prototype.xxx = function(){} 的方式
调用这个函数, 并且修改函数运行时的 this 指向
使用: fun.call(thisArg, arg1, arg2, ...)
核心原理: 通过 call() 把父类型的 this 指向子类型的 this ,这样就可以实现子类型继承父类型的属性。
一般情况下,对象的方法都在构造函数的原型对象中设置,通过构造函数无法继承父类方法。
1. class本质还是function.
2. 类的所有方法都定义在类的prototype属性上
3. 类创建的实例,里面也有__proto__ 指向类的prototype原型对象
4. 所以ES6的类它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。
5. 所以ES6的类其实就是语法糖.
6. 语法糖:语法糖就是一种便捷写法. 简单理解, 有两种方法可以实现同样的功能, 但是一种写法更加清晰、方便,那么这个方法就是语法糖
迭代(遍历)方法:forEach()、map()、filter()、some()、every();
使用: array.forEach(function(currentValue, index, arr))
// forEach 迭代(遍历) 数组
var arr = [1, 2, 3];
var sum = 0;
arr.forEach(function(value, index, array) {
console.log('每个数组元素' + value);
console.log('每个数组元素的索引号' + index);
console.log('数组本身' + array);
sum += value;
})
console.log(sum);
使用: array.filter(function(currentValue, index, arr))
注意它直接返回一个新数组
// filter 筛选数组
var arr = [12, 66, 4, 88, 3, 7];
var newArr = arr.filter(function(value, index) {
// return value >= 20;
return value % 2 === 0;
});
console.log(newArr);
使用: array.some(function(currentValue, index, arr))
注意它返回值是布尔值, 如果查找到这个元素, 就返回true , 如果查找不到就返回false.
如果找到第一个满足条件的元素,则终止循环. 不在继续查找.
使用: str.trim()
trim() 方法并不影响原字符串本身,它返回的是一个新的字符串
使用: Object.keys(obj)
返回一个由属性名组成的数组
使用: Object.defineProperty(obj, prop, descriptor)
obj:必需。目标对象
prop:必需。需定义或修改的属性的名字
descriptor:必需。目标属性所拥有的特性
Object.defineProperty() 第三个参数 descriptor 说明: 以对象形式 { } 书写
var fn = new Function('参数1','参数2'..., '函数体')
这些 this 的指向,是当我们调用函数的时候确定的。 调用方式的不同决定了this 的指向不同. 一般指向我们的调用者.
JavaScript 为我们专门提供了一些函数方法来帮我们更优雅的处理函数内部 this 的指向问题,常用的有 bind()、call()、apply() 三种方法。
call() 方法调用一个对象。简单理解为调用函数的方式,但是它可以改变函数的 this 指向。
fun.call(thisArg, arg1, arg2, ...)
apply() 方法调用一个函数。简单理解为调用函数的方式,但是它可以改变函数的 this 指向。
使用: fun.apply(thisArg, [argsArray])
bind() 方法不会调用函数。但是能改变函数内部this 指向
使用:fun.bind(thisArg, arg1, arg2, ...)
相同点: 都可以改变函数内部的this指向.
区别点:
主要应用场景:
严格模式在 IE10 以上版本的浏览器中才会被支持,旧版本浏览器中会被忽略。
为脚本开启严格模式
为函数开启严格模式
高阶函数是对其他函数进行操作的函数,它接收函数作为参数或将函数作为返回值输出。
合理的使用闭包
闭包应用-点击li输出当前li的索引号
立即执行函数中的i在立即执行函数执行完之后应该要销毁的,但是内部的点击事件需要使用i,所以要等到点击事件结束后才能销毁,如果一直不点击,i一直没销毁,会存在内存泄漏的问题
闭包应用-3秒钟之后,打印所有li元素的内容
闭包应用-计算打车价格
闭包是什么?
闭包的作用是什么?
利用递归函数求1~n的阶乘 1 * 2 * 3 * 4 * …n
输入id号,就可以返回相应的数据对象
浅拷贝只是拷贝一层, 更深层次对象级别的只拷贝引用(即地址).
Object.assign(target, …sources) es6 新增方法可以实现浅拷贝
浅拷贝中复杂类型数据被修改后,原数据中也会被修改(因为地址相同)
什么时候使用?
按照一定模式,从数组中或对象中提取值,将提取出来的值赋值给另外的变量。
面试题
.
剩余参数语法允许我们将一个不定数量的参数表示为一个数组。
function sum (first, ...args) {
console.log(first); // 10
console.log(args); // [20, 30]
}
sum(10, 20, 30)
剩余参数和解构配合使用
let students = ['wangwu', 'zhangsan', 'lisi'];
let [s1, ...s2] = students;
console.log(s1); // 'wangwu'
console.log(s2); // ['zhangsan', 'lisi']
1
4
3
6
2
5
将伪数组或可遍历对象转换为真正的数组
let arrayLike = {
'0': 'a',
'1': 'b',
'2': 'c',
length: 3
};
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']
方法还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理,将处理后的值放入返回的数组。
let arrayLike = {
"0": 1,
"1": 2,
"length": 2
}
let newAry = Array.from(aryLike, item => item *2)// [2, 4]
用于找出第一个符合条件的数组成员,如果没有找到返回undefined
let ary = [{
id: 1,
name: '张三‘
}, {
id: 2,
name: '李四‘
}];
let target = ary.find((item, index) => item.id == 2);
用于找出第一个符合条件的数组成员的位置,如果没有找到返回-1
let ary = [1, 5, 10, 15];
let index = ary.findIndex((value, index) => value > 9);
console.log(index); // 2
表示某个数组是否包含给定的值,返回布尔值。
[1, 2, 3].includes(2) // true
[1, 2, 3].includes(4) // false
ES6新增的创建字符串的方式,使用反引号定义。
let name = zhangsan
;
模板字符串中可以解析变量—${变量名}。
let name = '张三';
let sayHello = `hello,my name is ${name}`; // hello, my name is zhangsan
模板字符串中可以换行
let result = {
name: 'zhangsan',
age: 20,
sex: '男'
}
let html = `
${result.name}
${result.age}
${result.sex}
`;
在模板字符串中可以调用函数,调用位置显示函数执行后的返回值。
const fn = () => {
return '我是fn函数'
}
let html = `我是模板字符串 ${fn()}`;
console.log(html)
repeat方法表示将原字符串重复n次,返回一个新字符串。
'x'.repeat(3) // "xxx"
'hello'.repeat(2) // "hellohello"
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set本身是一个构造函数,用来生成 Set 数据结构。
const s = new Set();
Set函数可以接受一个数组作为参数,用来初始化。
const set = new Set([1, 2, 3, 4, 4]);
遍历:
Set 结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值。
const s5 = new Set(['a', 'b', 'c']);
s5.forEach(value => {
console.log(value)
})
ary = [{
id: 1,
name: '张三‘
}, {
id: 2,
name: '李四‘
}];
let target = ary.find((item, index) => item.id == 2);
### 实例方法:findIndex()
用于找出第一个符合条件的数组成员的位置,如果没有找到返回-1
let ary = [1, 5, 10, 15];
let index = ary.findIndex((value, index) => value > 9);
console.log(index); // 2
### 实例方法:includes()
表示某个数组是否包含给定的值,返回布尔值。
[1, 2, 3].includes(2) // true
[1, 2, 3].includes(4) // false
## String 的扩展方法
### 模板字符串
ES6新增的创建字符串的方式,使用反引号定义。
let name = `zhangsan`;
模板字符串中可以解析变量---${变量名}。
let name = ‘张三’;
let sayHello = hello,my name is ${name}
; // hello, my name is zhangsan
模板字符串中可以换行
let result = {
name: ‘zhangsan’,
age: 20,
sex: ‘男’
}
let html = `
在模板字符串中可以调用函数,调用位置显示函数执行后的返回值。
const fn = () => {
return ‘我是fn函数’
}
let html = 我是模板字符串 ${fn()}
;
console.log(html)
### 实例方法:startsWith() 和 endsWith()
+ startsWith():表示参数字符串是否在原字符串的头部,返回布尔值
+ endsWith():表示参数字符串是否在原字符串的尾部,返回布尔值
### 实例方法:repeat()
repeat方法表示将原字符串重复n次,返回一个新字符串。
‘x’.repeat(3) // “xxx”
‘hello’.repeat(2) // “hellohello”
## Set 数据结构
ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set本身是一个构造函数,用来生成 Set 数据结构。
`const s = new Set();`
Set函数可以接受一个数组作为参数,用来初始化。
`const set = new Set([1, 2, 3, 4, 4]);`
+ add(value):添加某个值,返回 Set 结构本身
+ delete(value):删除某个值,返回一个布尔值,表示删除是否成功
+ has(value):返回一个布尔值,表示该值是否为 Set 的成员
+ clear():清除所有成员,没有返回值
遍历:
Set 结构的实例与数组一样,也拥有forEach方法,用于对每个成员执行某种操作,没有返回值。
const s5 = new Set([‘a’, ‘b’, ‘c’]);
s5.forEach(value => {
console.log(value)
})