1.面向对象和面向过程的区别
面向过程:注重代码的过程
面向对象:注重代码的结果
2.面向对象三大特性
抽象 封装 继承 多态(JS不存在多态)
3.什么是一个构造函数
new 一个关键字函数 创建一个对象,该对象的的属性this指向window 函数里面指向这个对象
构造函数和普通函数的区别 :
1、前者的this的指向是实例化后的对象 后者的指向是指向window
2、普通函数返回值需要加return 构造函数不需要因为返回的是自己本身
为什么构造函数没有return却能够有返回值呢?
因为构造函数在调用的时候系统内部 自动return出了一个this,而这个this就是指的这个对象
这是就不得不说下this的指向问题了
this的指向调用它的对象(可以通过bind/apply/call来改变this的指向)
1.严格模式下this的指向为undefined
2.一个对象 属性this指向window 方法里面的指向为这个对象
3.异步事件this的指向为调用它的对象
计时器为window
ajax也为window
4.箭头函数中的this
此时的 this继承自obj, 指的是定义它的对象obj(也可以理解为它外层的指向就是它的指向), 而不是 window,里面只要还是箭头函数就一直是obj 而不是window 如若不是则是window(会继承下来)
var obj={ say:function(){ un=()=>{ console.log(this) //obj cn=function(){ console.log(this)//window } cn() dn=()=>{ console.log(this) //obj } dn() } un() } } obj.say()
var obj={ say:function(){ setTimeout(()=>{ console.log(this) //obj }); (function(){ console.log(this) //window })() setTimeout(function(){ console.log(this) //window
}) } } obj.say()
这里要注意输出顺序函数声明提升
5.箭头函数和普通函数混用
var obj = { say: function () {
console.log(this) //obj un=function(){ console.log(this) //没有宿主对象,默认是window setTimeout(()=>{ console.log(this) //定义它对象的obj是window }) } un() } } obj.say()
6.严格模式下的混用
箭头存在其中依然是undefinde
严格模式下,没有宿主调用的函数中的this是undefined!!!所以箭头函数中的也是undefined!