一、什么是类?什么是函数
1- function Phone(){ //函数对象
}
方法和属性添加在Phone中,但不在显式原型prototype
Phone.name='手机'
Phone.change=function(){}
let nokia=new Phone()
console.log(nokia.name) xxxx实例对象无,
nokia.change() xxxx实例对象无,
运用class类
class Person{
static name1='手机1' //函数对象有,可以直接访问,放在函数对象原型的constructor里
name2='手机2' //实例对象可以直接访问
constructor(){
this.d='111' //等价于上面的name2='手机2'
}
}
Person.name3='手机3' 等价于 上面的static .....
X1.__proto__.constructor //实例对象X1可以通过隐式原型->函数对象的原型,
//再访问构造器,获取函数对象的属性
二、原型和constructor
1-原型链
1.实例对象的隐式原型->函数对象的显式原型
2.每一个函数function x(){}都是Funtion的实例对象
3.每一个函数的显式原型X.prototype都是对象(Object)的实例
4.隐式原型是由低向高寻找
5.(而Function自身循环)Function的隐式原型指向Function显式原型=Function原型
绿色:代表实例对象 let user=new User()
蓝色:代表显示原型 User.prototype
黑色: 代表隐式原型 user.__ proto__
2-一般子类继承函数对象的方法后,要将子类的原型链用constructor指向自己
SmartPhone.prototype=new Phone()
SmartPhone.prototype.constructor=SmartPhone
三、部分深浅复制
1-filter(比浅复制多一层)
利用 var res=arr.filter(~) 是浅复制,修该res里的对象,(arr也会受到影响)
原因:
1.map,filter将数据遍历返回一个比浅复制多一层的内容
2.又将浅复制的内容'='赋值给res
经过了两次浅复制
案例 关于let array1=['yma16','china'] let array2=array1 let array3=array2.filter(item=>~) filter 1.如果在方法里修改[item数据]:arr.filter(item=>这里修改),不会影响array2的数据(前提:只需要普通数据) 2.如果修改array2数据array2[index]='changed',array1,array2数据都会改变 3.如果let array1=[{'yma16','china'}]里面是内嵌对象(字典), 修改此时item的对象array1,array2,array3 数据都会变
2-深浅拷贝
let array1=['yma16','china',{id:111}]
深拷贝
1.let array2=JSON.parse(JSON.stringify(array1))
比浅拷贝多一层
1.Object.assign()
2.[...array1]
四、其余问题
1-map
map不会对数组进行筛选,如果返回部分数据,则默认返回undefined作为子项:[undefined,1,undefined,undefined]
2-mouseleave 与mouseout
mouseleave事件是各元素各自触发,不是由子元素冒泡而来
而mouseout是由子元素冒泡而来(阻止冒泡false)
15-对象与数组
let A={a1:'111',a2:'222'}
let B=[111,222,333] 数组也是对象的一种,等价于=> B={0:111,1:222,2:333}
3-undefined(不是关键字)
var a=void 0 令a变量赋值为undefined