js核心内容(难点)

123 阅读2分钟

一、什么是类?什么是函数

1- function Phone(){ //函数对象

}
方法和属性添加在Phone中,但不在显式原型prototype Phone.name='手机' Phone.change=function(){}

let nokia=new Phone()
console.log(nokia.name) xxxx实例对象无,
nokia.change()          xxxx实例对象无,

运用classclass 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原型

原型链.jpg 绿色:代表实例对象 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 0a变量赋值为undefined