JavaScript 几个易错知识点

1.面向对象编程

举一个 例子说明一下:

面向对象思想: 猫.抓(老鼠)

面向过程思想: 抓.(猫,老鼠)

//面向对象
//定义猫(名字)
let Cat=function(name){
    this.name=name;
}
//动作
Cat.prototype={
    catch:function(someThing){
        console.log(`${this.name}抓${someThing}`);
    }
}
//创建一个猫对象
let daidai=new Cat('呆呆');
daidai.catch('老鼠');

//面向过程
let catch = function(who,someThing){
    console.log(`${this.name}抓${someThing}`);
}
catch("daidai","老鼠")

虽然结果相同,但是不难发现面向对象更加的灵活,复用性和扩展性更加。因为面向对象就是针对对象来进行执行某些动作。这些动作可以自定义扩展。

而面向过程是定义很多的动作,来指定谁来执行这个动作。

2.this

使用 JavaScript 开发的时候,很多开发者多多少少会被 this 的指向搞蒙圈,但是实际上,关于 this 的指向,记住最核心的一句话:哪个对象调用函数,函数里面的this指向哪个对象。

下面分几种情况谈论下

1).普通函数调用

这个情况没特殊意外,就是指向全局对象-window。
var username='mayue'
function fn(){
    alert(this.username);//mayue
}
fu();
//---------------
window.username='mayue'
function fn(){
    alert(this.username);//mayue
}
fn();
//可以理解为
//window.fn();
但是下面这种情况输出的就会是undefined,因为是let声明,不会是window对象
let username='mayue'
function fn(){
    alert(this.username);//undefined
}
fn();

2).对象函数调用

那个函数调用,this就指向哪里

3).构造函数调用

let TestClass=function(){
    this.name='yuema';
}
let subClass=new TestClass();
subClass.name='mayue';
console.log(subClass.name);//mayue
let subClass1=new TestClass();
console.log(subClass1.name)//yuema

注意:在构造函数里面返回一个对象,会直接返回这个对象,而不是执行构造函数后创建的对象

4).apply和call调用

apply和call简单来说就是会改变传入函数的this。

5).箭头函数调用

let obj={
    a:"mayue",
    fn:function(){    
        setTimeout(()=>{console.log(this.a)});
    }
};
obj.fn();//mayue
输出 mayue 是因为,传给 setTimeout 的是箭头函数,然后箭头函数里面没有 this ,所以要向上层作用域查找,在这个例子上, setTimeout 的上层作用域是 fn。而 fn 里面的 this 指向 obj ,所以 setTimeout 里面的箭头函数的 this ,指向 obj 。所以输出 mayue 。

3.call和apply

call 和 apply 的作用,完全一样,唯一的区别就是在参数上面。
call 接收的参数不固定,第一个参数是函数体内 this 的指向,第二个参数以下是依次传入的参数。
apply接收两个参数,第一个参数也是函数体内 this 的指向。第二个参数是一个集合对象(数组或者类数组)
let obj1={
    a:"mayue"
};
let obj2={
    a:"yuema",
    fn:function(){
        alert(this.a);
    }
}
obj2.fn.call(obj1);

call 和 apply 两个主要用途就是

1.改变 this 的指向(把 this 从obj2 指向到obj1)

2.方法借用(obj1没有 fn,只是借用obj2方法) 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值