ES6
创建类 ES6
```
class Star { // 创建一个类
constructor(names){ // 类的内置函数
this.names = names; // 赋值给this
this.main; // 通过this调用下面的自定义函数
}
main(){
console.log(this.names) // 内置直接调用
}
}
let aa = new Star("哈哈"); // 利用创建的类
console.log(aa.main) // 也可以通过外面调用main
```
```
element.insertAdjacentHTML('位置',文本的HTML内容) // 插入元素ES6才有
位置有以下几个内置对象
beforebegin // 插入元素到前面
afterbegin // 插入元素儿子的第一个节点前面
beforeend // 插入元素到儿子的最后一个节点后面
afterend // 插入元素到后面
```
创建对象 ES5
new Object()
var hero = new Object(); //创建空对象
hero.xue = 100;
hero.name = '张飞';
hero.wuqi = '刀';
对象字面量
var hero = {
blood: 100,
name: '张飞'
weapon:'剑'
}
工厂函数 创建多个对象
function createHero(name, blood, weapon) {
var o = new Object();
o.name = name;
o.blood = blood;
o.weapon = weapon;
o.attack = function () {
console.log(this.weapon + ' 攻击敌人');
}
return o;
}
构造函数 ES5
```
function Creat(name,blood){
this.name = name;
this.blood = blood;
}
Creat.prototype.main = function (){ // 创建原型对象
console.log("我是" + this.name)
}
console.log(Creat.constructor) // 打印原型对象的属性
```
构造函数的名字,第一个字母要大写,构造函数不需要返回,创建对象也不需要声明对象变量,调用的时候要用new来调用
构造函数名.constructor;可以查看该构造函数的源代码,用打印方式输出
constructor 一般常用于引用,比如B构造函数调用了A构造函数的原型对象,那么原型对象指向的是A,需要改变引用就要用constructor来 = B
instanceof 判断某个对象变量是否是某个构造函数的实例,就判断这个对象是不是这个构造函数创建的
使用方法:判断的变量变量名 instanceof 构造函数名 返回true或false
构造函数名.prototype 返回构造函数原型
构造函数名.prototype.对象变量名 = 对象变量数值 在原型构造函数里面增加一个新的对象,使全部调用的对象变量变动,追加的这种匿名函数都会使用一个内存地址,并不像原型内部包括的那种每次调用都进行创建,如果在原型中有需要追加的对象变量,那么调用时,优先输出原型中的,如果原型中没有才会调用追加的原型对象,追加类似替补,读取时,所有调用的对象变量,共用一个,但是如果对对象变量名进行赋值,那么会创建一个新的,替换掉原型的,所以只能预先设置,进行读取,后续无法修改
在构造函数内只有一个函数方法的时候,可以用prototype,如果多个,就需要
__proto__ === prototype
构造函数名.prototype.init 构造函数初始化样式
函数名.bind(变量) 用来改变函数中,this的指向,例如以下
```
var a = '123';
function fn(){
console.log(a);
}
var a = setInterval(function(console.log(this)){}.bind(b)),1000)
fn() //输出内容是123 上面这个代码,是在定时器内改变指向
var b = '456'
var fns = fn.bind(o);
fns(); //输出的内容就是456
```
自调用函数的时候,如果有多个自调用,尾部加一个分号,用来结束语句,防止代码出问题
压缩代码后,勾选混淆,会把变量变短
继承
```
class Abc{ // ES6
constructor(){
}
aa(){
console.log("打印这里")
}
}
class Dce extends Abc { // 复制对象(继承)
constructor(){ // 获取函数是就近原则,先看自己,再看父级
super.aa() // 调用父级中的构造函数,如果使用父级的普通函数,就需要传递
}
}
var dce = new Dce();
console.log(dec.aa()) // 打印测试
```
B对象复制A对象时,B对象如果有相同类型的对象跳过,继续遍历复制,这就是继承对象
函数名.call(this指向的变量,函数变量) 跟bind一样,只是前者返回一个新的函数,这个是直接调用函数,改变指向
借用构造函数的方法,只能继承属性,无法继承方法,方法要是写在构造函数内可以,要是放在原型对象里面就不行
```
function Person(name,age,sex)(){
this.name = name;
this.age = age;
this.sex = sex;
}
function Student(name,age,sex,score){
Person.call(this,name,age,sex); //这就是在借用另外一个构造函数的代码
this.score = score; //实现这个构造函数只要给变量就可以,节省代码
}
var s1 = new Student('张三',18,'男',100)
```
ES5 增加的数组方法
```
var arr = [10,12,88,"blue"]
arr.forEach(function(value,index,array){ // 数组遍历
// value 数组中每个成员的值
// index 数组中每个成员的索引
// arrar 数组本身
}) //↓ 创建新的数组,可以过滤成员
var newArr = arr.filter(function(value,index){
return value >= 10; // 返回大于10的数组成员,组成新的数组
})
if(arr.some(function(value){ // 对数组中进行查找,并返回false
return value == "blue"; // 只查找到第一个就跳出
})){
}
```
ES5中对象Objcet增加和修改
```
var obj = {
name: "你好",
id: "2",
sex: "女"
}
var arr = Object.keys(obj) //把objcet中的属性获取到后赋值给arr数组
//Object.defineProperty("目标对象","需要修改的属性","")
Object.defineProperty(obj,"num",{ //如果里面有num则修改,没有则增加
value:1000, // 设置num的值为1000
writable:false, // 锁死这个属性,之后无法修改
enumerable:false, // 是否遍历时,可以被发现
configurable:false // 是否可以被删除和修改
})
```
组合继承
组合方法跟继承call一样,只是原型对象也要借用,通过以下方法来调用
```
Student.prototype = new Person(); //让B构造函数的原型对象和A的相等,来调用
Student.prototype.constructor = Student; //让B原型对象指向B,原来是A,借来不变
```
var fn = new Function('a','b','console.log(a + b)')
fn(1,2) //结果就是3,这样子一行代码就可以,但是速度会慢,需要多次解析
函数内部的this,是由函数调用的时候来确定其指向的
call、bind、apply
call可以借用其他类型的方法,例如 对象借用数组的方法,需要对象为伪数组
数组借用对象的方法,实际应用就是减少代码,通过内置方法来达到目的,提高速度
bind,改变函数的指向
call,调用函数,顺带改变指向
apply,可以直接展开数组中的对象,顺带改变指向,带调用
被借用函数.apply(指向函数,借用函数) 一般是数组,或者对象,其他没有层叠分明
闭包
就是嵌套函数中,最内部的函数调用外层函数的这个过程叫做闭包,如果最内层没有调用外部函数的变量或者对象,将不会产生闭包现象,闭包可以有效的减少代码
递归
递归的真正用途是,把两个对象进行复制,让B复制A,包含深度复制
正则表达式
? 关闭贪婪模式
RegExp(模式pattern,flag忽略大小写) flag(i忽略大小写,g全局匹配)
```
var a = new RegExp('([\S\s]*?)','i') //第一种创建方法
var b = 'asbasdag'
a.test(b)
var re = /([\S\s]*?)/ig //第二种创建方法 /中间是正则表达式/这里放大小写和全局
var rr = 'asdgahaha' //正则方式.提取(文本),与String对象的方式相互转换
re.test(rr) //返回的是false或者true
re.exec(rr) //返回匹配内容,类型为数组,一定要全局匹配,不然只返回第一个匹配
//这种方式,如果匹配为多个,需要循环来调用,循环第一次提取1,循环2,提取2,以此类推
rr.match(re) //文本.提取(正则方式),返回所有匹配内容,也一样要全局
rr.split('分隔符') //切割的用法,返回数组
rr.split(' ').join(); //这种方法也可以替换文本中的空格,先分割,后合并数组成员
rr.replace(替换前内容,替换后内容); //只替换一个内容
rr.replace(这里可以使用正则表达式,全部替换要加全局,替换后内容)
rr.replace(/,|,/g,'.') //全选,匹配两种,然后全部替换为点
rr.trim() //只替换前后内容,开头与结尾
```
RegExp对象
test() 匹配
exec() 提取
String对象
match() 提取
replace() 替换
split() 切割
search()
```
var 全局变量 在函数内,作用域就是函数内,函数外则全局
let 局部变量 {在这里有效} 需要先声明后在使用,var可以先使用在声明
const 常量 如果是数组,则可以修改数组成员的值,但不可以增加和减少成员,且不可以重新赋值
```
箭头函数
```
const sn = () => { // 标准写法
}
sn
const sn = (a,b) => a + b; // 两个以上形参的写法
相当下面这个函数
function sn(a,b){
return a + b;
}
const sn = a => console.log(a) // 一个形参的可以更省略
```
剩余参数
```
function main(a,...b){ // 加3个点,多余的实参将合并到形参中,为数组
console.log(a)
console.log(b)
}
main(1,2,3,4,5)
let a = [1,2,3,4,5]
let [a1,...a2] = a; // a1= 1, a2 = [2,3,4,5] 剩余数组赋值给a2
console.log(...a) // 打印数组内的成员为文本
let b = [6,7,8];
let c = [...a,...b] // 合并数组1
a.push(...b) // 合并数组2
```
```
var array = {
"0": "张三",
"1": "李四",
"2": "王五"
}
var arr = Array.from(array) // 还可以在第二个参数放一个函数处理数组
console.log(arr) // 将objcet 变成一个真的数组
```
数组的一些方法
```
arr.find() 返回在测试函数中通过测试的数组中第一个元素的值
arr.findIndex() 返回在测试函数中通过测试的数组中第一个元素的索引
includes() 与indexOf用法一样,只是返回的是true和false
```
字符串的方法
```
let name = `张三`;
let sayHello = `我的名字叫${name}`; // 可以直接给文本内放变量
let re = {
name: "张三",
age: 20
}
let html = ` // 可以直接调用对象里没的文本
<div>${re.name}<\div>
<div>${re.age}<\div>
`;
```
startsWith() 和 endsWith()
```
let str = 'AbcdeF'; 用来判断首字母和尾字母是否是判断的字母,返回逻辑
str.startsWith('Abc') // 返回 true
str.endsWith('f') // 返回 false
```
repeat()
```
let str = "ABC";
str.repeat(3) // 返回 ABCABCABC 设置几就是重复几次生成一个新文本
```
set 结构去重
```
let arr = new Set(['a','b','a','b','c']);
log(arr.size) // 返回去重后的 abc
Set 的方法有几个
add(value) // 添加某个值,返回Set结构本身
delete(value) // 删除某个值,返回一个布尔值
has(value) // 返回一个布尔值,判断是否是Set成员
clear() // 清空所有成员,无返回
arr.add('s').add('k')
arr.delete('s');
arr.has('f');
arr.clear()
arr.forEach(value => { // value为形参
console.log(value)
})
```